首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么极简主义,例如Haskell quicksort不是一个"真正的"快速排序?

极简主义是一种设计理念,强调去除不必要的元素,使得事物更加简单、纯粹,以达到更高的境界。在编程领域,极简主义也被应用于代码的编写和设计上,即编写简洁、高效、易于理解的代码。

在这个问答内容中,极简主义被应用于快速排序算法的实现上。Haskell QuickSort 是一个简洁的快速排序实现,它使用了 Haskell 语言的特性,如惰性求值和模式匹配,使得代码更加简洁。但是,这种实现方式可能会牺牲一些性能,如递归深度过大、数据分布不均等问题,因此可能不被认为是一个“真正的”快速排序。

然而,需要注意的是,极简主义并不是一种绝对的标准,每个人对于简洁的定义都可能不同。在实际应用中,需要根据具体的场景和需求,权衡代码的简洁性和性能,选择合适的实现方式。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

作为现代开发基础,为什么 TDD 没有被广泛采用?

而强 TDD 遵循一个更严格“红 - 绿 - 重构”周期。 编写一个最小失败测试。 编写尽可能少代码来通过测试。 在不引入新行为情况下重构一切。 重点是(minimality)。...TDD 和生产力之间权衡关系到学习曲线。一旦你到达山顶,那就没有什么权衡事了。如果你还在谈论权衡,那就表明你可能在山上什么位置。 我认为,真正极致主义者并不多,尽管我至少遇到过一个。...有了更多测试,它就会趋于正确,但由于我们将代码封装在一组小型测试中,因此设计将会变得很不可靠。 既然我说我正在做是“弱 TDD”,所以我还是会在快速排序QuickSort)之前写一个测试。...这导致了我对主义 TDD 最大不满:它强调局部组织而不是全局组织。如果它能让你不对一个函数进行整体思考,那么它也能让你不对整个组件或组件之间交互进行整体思考。它能带来更好设计。...TDD 主义者也许会说它并非“真正 TDD”,让他们见鬼去吧。 弱 TDD 有四个好处: 你可以编写更多测试。如果编写一个测试“Gates”来编写代码,你就必须这么做。

51030

成为函数式编程工程师四年,我为什么说它既“流氓”又“可爱”

如今,没有哪种新发布编程语言不支持“函数式编程”,甚至保守温和、经过企业认证 Java 也开始有了 lambdas 甚至 monads。 是的,这是一个全新世界。 为什么转向函数式编程?...函数式编程“宗教信仰” 在函数式编程(FP)光谱上,人们都落在了两个极端上。在一个极端,FP 是一种能够丰富指令式编程方式(例如,将一个轻量级回调传递给一个函数,或将一个块传递给一个循环)。...因此,我把它称为 FP “宗教信仰”。但只要是“宗教”就会有一个问题,那就是可能存在盲目的教条主义。 对于 FP 来说,我认为它蒙蔽了许多人眼睛,让他们看不清一些本该显而易见东西。...我答案是:不一定。 “流氓”函数式编程 为了说明我观点,我决定在函数式编程语言 Haskell 中实现快速排序。...可爱函数式编程 现在我想给大家看一下 Haskell 中比较有名快排例子。这并不完全是经典快速排序,因为它并不是原地排序,但也足够接近了。

34120
  • 如何写出简洁、高效代码?

    我开始在网上寻求帮助,有人推荐我去看纪录片《主义:记录生命中重要事物》。 但是,什么是主义? 用主义者自己的话来说: 主义是一种生活方式,它帮助人们辨别给生活增添价值事物。...我相信,主义也帮助我提高了效率并成为了一个更好开发者:只编写和提交有价值代码,使其更干净、更易于阅读和维护,并帮助我更好地利用时间。 我是如何在代码中应用主义?以下是一些例子。...与注释代码一样,我们做了无用功,以换取它最终变得有价值可能性。 例如,你正在开发一个网站登录功能。编写一个名为UserService类,此类包含了一个名为Login方法。...因此,如果不添加备用代码,那么你会更有效地利用时间(以及团队时间)。 4、质疑你想法 主义是对事物质疑。不要经验主义,不要“我们一直都是这样做”。...推荐资料 如果你对主义感兴趣,这里有一些资源供参考: 主义者在Netflix上制作了一部非常酷纪录片,叫做《主义:记录生命中重要事物》; 推荐马特·达维拉在YouTube上谈论主义和自我完善

    1.1K20

    从 Java 和 JavaScript 来学习 Haskell 和 Groovy(DSL)

    当我们面对各种各样特定需求时候,一个通用语言往往不能高效地提供解决问题路径,相应 DSL 并不是并非要解决所有的问题,但是它只关注于某一个小领域,以便解决那一个小领域问题就好了。...这也不是 Java 特有的东西,只不过 Java 限制太多,能帮助 DSL 特性很少,第一个能想到就是它而已。...考虑一下排序经典例子,可以自定义 Comparator 接口实现,从而对特定对象列表进行排序。...比如: Prelude> :t max max :: Ord a => a -> a -> a 上面描述调用本质决定了为什么结构是 a->a->a:接受一个类型 a 参数,再接受一个类型 a 参数...听起来简单,但是只有 Haskell真正支持惰性求值,其他语言最多是在很局限范围内,基于优化语言运行性能目的,运行时部分采用惰性求值而已。

    48310

    2019年网页设计趋势前瞻,先睹为快!

    回顾2018年网页设计趋势,不难看出许多设计趋势都是周期性和持续性例如盛行不衰主义和响应式设计。...主义 6. 响应式设计 7. 渐变设计 8. 排版设计 9....因此,2019年,更多网页设计师会优先考虑网页移动版本设计。而SEO并不是仅仅是其中一个推动网页移动优先设计因素。据统计,目前全球50%网站流量都来自于移动端。...图片来源:Mockplus iDoc,更快更简单产品设计协同软件 2019年网页设计趋势之五:主义,简约不简单 作为最经典和永恒网页设计趋势之一,主义往往是“简约”设计首选。...这就是主义精髓。而将这个概念应用到网页设计上,那么就是使用较少界面设计元素实现影响巨大简约设计。简约,而不简单。 快速、动态生活节奏使得现代人已经没有足够时间去关注更多冗余信息。

    84840

    UI风设计,你需要掌握这几点

    简约并不意味着原始,这是两个截然不同概念。而主义设计种大量留白也并不等同于空。 如今,我们常常在工作和生活种不同语境下探讨主义,而设计和它走最近。...对于主义,我们应该熟知它优缺点和关键知识点。...相应主义在当时诸如包豪斯运动、建构主义运动中,留下了浓墨重彩一笔。 在涉及视觉艺术不同领域,主义核心原则基本都是优雅地保留关键性、引起观者注意力部分。...主义设计最佳实践 如今主义设计已经成为网页和UI设计中主流设计趋势,而主义设计主要特征,可以通过下面的这些最佳实践来体现。...而这种内在冲突让主义设计为人所诟病:如果没有经过足够调研和测试,汉堡菜单这类用来隐藏导航和信息解决方案,可能会让用户无法正确、快速地找到他们想要内容,甚至在网站中迷失,这不是积极而有效用户体验设计

    1K30

    为什么大家都爱主义设计

    如今,我们常常在工作和生活种不同语境下探讨主义,而设计和它走最近。对于主义,我们应该熟知它优缺点和关键知识点。 ?...关于主义 实际上主义这个词在人类活动各个领域中都被地使用着,Merriam-Webster 词典种对于它解释是“在音乐、文学和设计领域中以极其平衡简洁而著称一种风格或技术”。...相应主义在当时诸如包豪斯运动、建构主义运动中,留下了浓墨重彩一笔。在涉及视觉艺术不同领域,主义核心原则基本都是优雅地保留关键性、引起观者注意力部分。...Dance Academy 着陆页 主义设计最佳实践 如今主义设计已经成为网页和UI设计中主流设计趋势,而主义设计主要特征,可以通过下面的这些最佳实践来体现。...而这种内在冲突让主义设计为人所诟病:如果没有经过足够调研和测试,汉堡菜单这类用来隐藏导航和信息解决方案,可能会让用户无法正确、快速地找到他们想要内容,甚至在网站中迷失,这不是积极而有效用户体验设计

    69320

    数百次采访后,我总结了 2021 年最好用区块链开发框架

    评选框架需要: 部署到一个本地区块链 进行快速有效测试 使用 Chainlink 将一个智能合约部署到 KovanTestnet 第三个标准很重要,因为它让我得以测试框架如何与其他软件包交互和集成测试交互...他们有一些默认选项,例如 ERC20 和 ERC721 工具,你可以在其中导入他们合约并在几秒钟内建立一个令牌。...它使用了许多最新 React 技术(例如状态 Hooks),并让开发人员可以很容易地构建真正强大前端。...它是用 Haskell 编写,但支持许多我们喜欢和常用插件,例如 OpenZeppelin。它看起来像一个主义框架,但功能强大到足以做到你想做事情。...我可以找到关于使用这个平台部署合约帮助,另外它简洁也给人留下了深刻印象。如果你正在寻找一个对命令行友好主义框架,那么我建议你也看一下这一款。

    63520

    图解算法-读后感-快速排序

    这是我长期主义吗? 我学习目的是什么?单纯为了好面试表现,我觉得不是,我觉得哪些是有意义,传播知识,传播方法论可以,做自己开源项目可以。坚持下去,与君共勉!!!!...解决问题第一步就拆分问题,第二步就是细化问题。 一个算法问题,首先就应该是划分类型,在这个类型里面去细化场景与实现。 分治法核心我个人觉得是把一个复杂问题拆解成多个相同小问题。...快速排序 实现 let array = new Set(); for (let i = 1; i <= 10; i++) { array.add(parseInt(Math.random() * 100...image.png 结束 是不是一个二分法衍生熟悉场景,\log_2(n),是我们执行层数,每一层执n次,显然结果出来是:n*\log_2(n)。...随机化,每次比较值都是不确定,也不一定取第一个。 在有序数据场景下面,随机化能带来巨大收益。

    45330

    《图解算法》第4章 快速排序

    陷入困境时,请检查基线条件是不是这样 函数式编程一瞥:为何还要使用递归方式呢?看看函数式编程你就明白了!诸如Haskell等函数式编程语言没有循环,因此你只能使用递归来编写这样函数。...如果你对递归有深入认识,函数式编程语言学习起来将更容易 ? 快速排序 首先,从数组中选择一个元素,这个元素被称为基准值 (pivot),接下来,找出比基准值 小元素以及比基准值 大元素 ?...现在你有 一个由所有小于基准值 数字组成子数组 基准值 一个由所有大于基准值 数字组成子数组 操作步骤如下 选择基准值 将数组分成两个子数组:小于基准值 元素和大小基准值元素 对这两个子数组进行快速排序...在平均情况下,快速排序运行时间为O(n log n) 比较合并排序快速排序 快速查找速度确实更快,因为相对于遇上最糟情况,它遇上平均情况可能性要大得多 平均情况和最糟情况 快速排序性能高度依赖于你选择基准值...假设你总是将第一个元素用作基准值 ,且要处理数组是有序。由于快速排序算法不检查输入数组是否有序,因此它依然尝试对其进行排序 ?

    55240

    一场函数式思维模式洗礼

    写在前面 以下语境都是Haskell,没有循环结构,只能用递归来写作业 一.递归 先从一个简单递归问题感受下函数式语言语法魅力 求数组中最大元素,可以这样做: -- if-else maximum...,所以没有slice之类东西,因为能够通过drop, take组合出来,专门提供一个就显得多余了 复杂场景 快速排序知道吧,写一个呗 快排核心思路是: 男站左边,女站右边,老师站中间 好,开始排座位了...老师”,左侧元素都比他小,右侧元素都比他大(或相等) 每趟快排目标是找出pivot最终位置,这个目的与冒泡/选择排序差不多:每趟选出一个最大/最小元素。...听起来很熟悉,没错,小学6年级时,数学老师说: 这个问题用二元一次方程来解非常容易,用算术方法不太好想 从抽象到具体,是一种正向思维过程,想要一步达到具体,则难多 P.S.要不,来个JS快速排序?...[] : quickSort(xs.filter(a => a a >= x))) } 为什么!

    45340

    Python实现快速排序

    尽管算法和语言关联实现差别不是很大,重在思想,我是希望直接一些,能看到最直接就懒得转换了。 看这本书时候有几个瞬间突然有顿悟感觉。...第一个是一般翻译书内容背景很难转换,老外举例子我们很多时候没有代入感。...如果说原来是明白了5分,现在是打通了原来一道壁垒,我能够真正接受那种设计方式。 第三个是对于算法设计,排除了我原来一些盲点。...记得大学看一个算法,花了好几个小时,结果上课时候,老师花了不到五分钟就讲完了,然后脑袋一片空白,记得当时学快速排序时候,感觉这个算法应该是很复杂,感觉理解了,但是很快就忘记了。...使用循环,程序性能可能而更好,但是使用递归,程序更容易理解。 对于快速排序,算法思考方式就是由到难。

    96370

    重磅!谷歌Chrome再添标签组黑魔法,微软Edge瑟瑟发抖

    世界上有两种人: 一种是标签主义者,他们每次只打开几个标签; 一种是标签收集者,他们有很多很多很多标签。...对于主义者和收藏家一样,谷歌 Chrome 浏览器带来了一种新方式来组织标签到 Chrome 标签组。这个功能现在可以在 Chrome 测试版中使用。 ?...Chrome 中标签组可以帮助你管理你标签。 只需右键单击,就可以将选项卡组合在一起,并使用自定义名称和颜色进行标记。一旦标签组在一起,你可以在标签条中移动和重新排序。...例如,如果你同时处理多个项目,或者浏览多个购物和评论网站,它会很有帮助。 其他人则根据紧急程度分组——“尽快”、“本周”和“稍后”。...同样,标签组可以帮助跟踪你在某些任务上进展:“尚未开始”、“进行中”、“需要跟进”和“完成”。 专业技巧是,你可以使用一个 emoji 组名称,例如❤️寻找灵感,或?文章阅读。

    49820

    tinygrad框架简介;MLX框架简介

    ​目录tinygrad框架简介MLX框架简介LLaMA​编辑Stable Diffusion​编辑tinygrad框架简介主义与易扩展性 tinygrad 设计理念是主义。...这种简约设计使得它成为添加新加速器最容易框架之一。通过简化框架架构,开发者可以更轻松地理解和扩展它。基本信息开发者:tiny corp设计理念:主义。...主要特点轻量级:tinygrad是一个轻量级深度学习库,其代码库专注于深度学习基本组件,这种简单性使得理解和修改代码变得更加容易。...详细安装步骤和快速入门指南可以在其官方文档中找到。...MLX框架简介基本信息开发者:Apple机器学习研究团队设计理念:专为苹果芯片设计,旨在提供一个既简单易用又高效研究环境,让研究人员能够快速探索和实现新算法思想。

    12420

    博客重构:主义

    但是,过去半年里,我这个博客却少有更新,我最近不禁问我自己:我这是怎么了?刚开始写博客时那种热情去哪了?经过一段时间思考后,我决定重构博客,拥抱主义!...(至繁归于至)[1] — Leonardo da Vinci 除旧 第一步,简化分类,简化标签。你可能注意到,我之前博客分类颇为复杂,标签也颇为繁冗。为什么我要设计得如此复杂呢?...其实,这是因为我搭建这个博客初衷并不是为了记录自己,而是为了归档我所习得各种知识,以利于我创造。...而我于去年搭建了一个博客,将哲学独立分离了出去,因此这个博客分类和标签也是时候简化了,分类只有两个:生活、技术,标签则每篇文章不超过 5 个。 第二步,页面元素,页面交互。...第三步,浏览统计,评分评论。有时评论区会带来很大心理压力,各种统计数字则是一种隐形心理压力。另,博客是静态,而这些属于动态内容,技术上讲即是写操作,违背了纯静态只读原则[2]。

    86830

    设计最佳实践

    随着移动设备被越来越多使用,主义设计思想也伴随着流行开来。...美丽主义应用程序与伟大可用性结合令人印象深刻:一个容易导航,简单应用程序是一种非常强大通信形式。...4、多使用留白——合理留白有助于避免混乱外观 所谓留白是指内容之间/之外处于空白区域,在颜色上并不局限于白色。它是主义一个重要组成部分——它使得元素更清晰呈现出来且易于阅读。...5、结论 主义用户界面确实是实现优秀设计一种方式,但它不是目标。 “Form follows function”——形式追随功能!...这意味着,主义设计最终目标是实现返璞归真,在最纯粹样式中,还原最基本东西,创建一个无缝流畅设计体验。这就要求一个设计师既能遵从可用性基本要求,又要保持精益求精设计追求。

    1.1K70

    重学数据结构和算法(五)之归并排序快速排序

    目录 归并排序(Merge Sort) 归并排序原理:分治法 如何用递归代码来实现归并排序 快速排序Quicksort) 代码实现快速排序 O(n) 时间复杂度内求无序数组中第 K 大元素 最近学习了客时间...归并排序快速排序时间复杂度为 O(nlogn) 。这两种排序算法适合大规模数据排序 稳定,但是,归并排序并没有像快排那样,应用广泛,这是为什么呢?...因为它有一个致命“弱点”,那就是归并排序不是原地排序算法。 这是因为归并排序合并函数,在合并两个有序数组为一个有序数组时,需要借助额外存储空间。...归并排序原理:分治法 归并排序快速排序都用到了分治思想,非常巧妙。我们可以借鉴这个思想,来解决非排序问题,比如:如何在 O(n) 时间复杂度内查找一个无序数组中第 K 大元素?...对”基准”左边和右边两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。 快速排序和归并排序对比 归并排序处理过程是由下到上,先处理子问题,然后再合并。

    1.2K20

    击败谷歌AI秘籍在此

    例如,你可以从中了解德国人和韩国人对猫或椅子有什么不同看法。 ? 当然,其中一些模式非常值得思考。很显然,韩国人和俄罗斯人更喜欢把椅子画在角落或侧面。为什么?...(快速涂鸦) 在游戏中,玩家将有20秒时间来用鼠标画出一个指定图像,而在这20秒结束之前,AI会尝试猜出玩家画出来是什么东西。 跟现在小程序版本大同小异。...然而与真正意识流高手相比,差距不是一点半点。 举几个例子。 请问,这个画是什么? ? 答案:天使 这个画是什么? ? 答案:航空母舰 这个呢? ? 答案:大炮 …… ?...总之,真正灵魂画手,不惮于用最简单笔画,描述这个世界。 这是绘画界主义。 量子位尝试模仿这个手法,不是太能成功……很多情况下失败了。...如果你实在想知道全部参考答案,同样,在量子位公众号(ID:QbitAI)对话界面,回复:“答案”两个字即可。 最后,讲一个真正知识点。 谷歌并不是等你画完,才开始根据整幅画来猜

    68420

    场景化×颠覆性创新:与用户一起打磨之“光”

    锐捷网络产品经理实地了解客户需求 用户为什么要改用全光方案?采纳PON方案后实际感受如何?...RG-SF2910系列光交换机 在精准切入大痛点同时,满足用户在每一个细节小需求,正是光方案独到之处。...直指核心颠覆性创新 如果说光一代主要解决了光纤更替和交换机入室接入层问题,那么汇聚和核心层颠覆性创新,真正使锐捷成为以太极全光这一技术路线引领者。...为提升光二代解决方案落地进程,锐捷网络将在产品设计、布线施工、业务上线等方面持续精进。例如:用直角弯电源线排解空间挤压和安全隐患,调整病房中交换机指示灯亮度来改善用户体验。...这些深入场景微创新,与产品技术颠覆性创新相辅相成,共同勾勒出流光溢彩未来。 主义是二战后勃兴艺术流派,开放作品意象空间,让观者参与作品建构,是其精髓所在。

    48210

    【字节跳动】第十二讲 数据结构与算法 | 青训营笔记

    GitHub:github.com/zhangyunhao116 目录 为什么要学习数据结构和算法 了解课本上学习到算法和真正在生产实践中使用算法之间差异 经典排序算法 复现在课本上学习到经典排序算法...经典排序算法 2.1 Insertion Sort 插入排序 将元素不断插入已经排序array中 起始只有一个元素5,其本身是一个有序序列 后续元素插入有序序列中,即不断交换,直到找到第一个比其小元素...结论 所有短序列元素有序情况下,插入排序性能最好 在大部分情况下,快速排序有较好综合性能 几乎任何情况下,堆排序表现都比较稳定 我认为这个比例不是很好,并不能完全表达这三种排序 2.4.6 设计一个更好算法...思考关于pivot选择 使用首个元素作为pivot(最简单方案) 实现简单,但是往往效果不好,例如在sorted情况下性能很差 遍历数组,寻找真正中位数 遍历对代价很高,性能不好 问题描述:找到【...根据不同情况选择不同策略,取长补短 生产环境中使用排序算法和课本上排序算法有什么区别? 理论算法注重理论性能,例如时间、空间复杂度等。

    83130
    领券