当前位置: 首页 > 面试题库 >

哪种排序算法最适合非常大的数据集

桓宜
2023-03-14
问题内容

我在Internet上搜索以找到最适合于非常大的数据集的排序算法。我发现许多人认为合并排序是最好的,因为它是公平的,并且它可以确保时间复杂度为O(n log
n)并且快速排序是不安全的:诚然,快速排序的变体也可以不安全,因为实际数据集可以是任何数据。

如果交换两个元素的时间成本可以忽略不计,那么为什么在这种情况下为什么不能选择堆排序作为最佳排序算法呢,因为它与O(n log n)一样就位了?

在合并排序的情况下,它需要另一个O(n)空间;如果数据非常大,则无法使用此算法。

请告诉我:在这种情况下哪种算法最好?


问题答案:

没有一种算法显然是“最佳”算法。这取决于许多因素。

首先,您可以将数据放入主存储器吗?如果不能,那么您将需要依赖外部排序算法。这些算法通常基于quicksort和mergesort。

其次,您对您的输入分配了解吗?如果大多数数据是经过排序的,那么像Timsort之类的东西可能是一个不错的选择,因为它被设计为可以很好地处理已排序的数据。如果大多数情况下是随机的,那么Timsort可能不是一个好选择。

第三,您要排序哪种元素?如果要对通用对象进行排序,那么您几乎就只能进行比较排序。如果不是这样,也许您可​​以使用非比较排序,例如计数排序或基数排序。

第四,您有几个核心?一些排序算法(快速排序,合并排序,MSD基数排序)确实很好地并行化,而其他算法则没有(并行排序)。

第五,您的数据如何表示?如果将它们存储在数组中,则由于引用的局部性,quicksort或quicksort变体可能会做得很好,而由于需要额外的内存,mergesort可能会变慢。但是,如果它们在链表中,则来自quicksort的引用位置会消失,并且mergesort突然变得更具竞争力。

最好的选择可能是考虑很多不同的因素,然后从那里做出决定。设计和研究算法之所以如此有趣的原因之一是,几乎没有一个最佳选择。通常,最佳选择取决于您的具体情况,并根据您所看到的内容进行更改。

(您在总结此答案之前提到了有关quicksort,heapsort和mergesort的一些详细信息。在您没错的情况下,quicksort具有退化的O(n
2)最坏情况,但是有很多方法可以避免这种情况。introsort算法会跟踪递归深度,并在快速排序看起来退化时将其切换到堆排序,从而保证O(n log
n)最坏情况的行为以及较低的内存开销,并最大程度地提高您的收益。 quicksort。随机快速排序虽然仍然具有O(n
2)最坏的情况,但实际上碰到最坏情况的可能性却很小。

Heapsort在实践中是一个很好的算法,但是在某些情况下不如其他算法那么快,因为它没有很好的参考位置。也就是说,它永远不会退化并且仅需要O(1)辅助空间这一事实是一个巨大的卖点。

Mergesort确实需要大量辅助内存,这就是为什么如果您要排序的数据量很大,可能不想使用它的原因之一。不过,由于它的变体被广泛使用,因此值得了解。)



 类似资料:
  • 问题内容: 由于这个问题很受欢迎,因此我认为对其进行更新很有用。 让我强调AviD对这个问题给出 的正确答案 : 您不应在Cookie中存储任何需要加密的数据。 而是在cookie中存储一个大小合适的(128位/ 16字节)随机密钥,并在cookie的密钥中标识要在服务器上保持安全的信息。 我正在寻找有关“最佳”加密cookie加密算法的信息。 我有以下要求: 它必须快速 加密和解密(几乎)每个请

  • 更多面试题总结请看:【面试题】技术面试题汇总 基数排序:$r$ 代表关键字的基数,比如对十进制数字的 $r == 10$;$d$ 代表位数,比如 [0~999] 范围内的数字的 $d == 3$。 桶排序:$m$ 代表桶的个数。 稳定的排序算法:冒泡排序、归并排序、基数排序、直接插入排序、桶排序。 不稳定的排序算法:快速排序、堆排序、直接选择排序、希尔排序。 O(nlogn) 的排序算法:快速排序

  • 在得到答案之前,我冒着这个问题被关闭的风险,但我真的很想知道答案。所以现在开始。 我目前正在尝试学习算法,我开始理解它,但无法与它联系起来。 我理解时间复杂性和空间复杂性。我也理解一些基于伪代码的排序算法 排序算法,如 气泡排序 插入排序 选择排序 快速排序 合并排序 堆垛(一些什么) 我也知道最佳情况和最坏情况(一般情况不多)。 一些在线相关参考资料 不错的地方,用图形显示了上述所有内容。 这也

  • 问题内容: 我正计划开始一个新项目,并正在研究当前最新的Java Web框架。我决定围绕Guice构建我的应用程序,并可能使用非常轻量级的ORM,例如Squill / JEQUEL / JaQu或类似的东西,但是我不能决定Web框架。在如此轻巧的环境中,哪一个最合适?哪一个与Guice集成得最好? 问题答案: 我在11月开始为一个新项目进行编程时,已经在该主题上积累了一些经验。该项目现在处于后期。

  • 问题内容: 我目前正在寻找其他搜索方法,而不是拥有庞大的SQL查询。我最近看过Elasticsearch,并玩过whoosh(搜索引擎的Python实现)。 您能给出选择理由吗? 问题答案: 作为ElasticSearch的创建者,也许我可以为您提供一些理由,说明我为什么继续并首先创建它:)。 使用纯Lucene具有挑战性。如果要使其真正发挥出色,就需要注意很多事情,而且它是一个库,因此没有分布式

  • 本文向大家介绍JavaScript数组排序的六种常见算法总结,包括了JavaScript数组排序的六种常见算法总结的使用技巧和注意事项,需要的朋友参考一下 前言 着急用的话,选择前两个就行了,后面的看看就好。 开发中,遇到数组排序的需求很频繁,这篇文章会介绍几个常见排序思路。 一、希尔排序(性能最好) 如果要从大到小排列,则 while(arr[n] > arr[n - interval] &&

  • 给定一组数,找出任意数适合的最小倍数和 < li >集合中的数字可以多次使用(或根本不使用)以获得“总和” < li >这组数字可以是任何正十进制数(即< code>1,4,4.5 ) < li >给定/任意数阈值可以是任意小数(即< code>5 ) > < li> 找出给定数字能与最小余数相适应的倍数组合 找到一个数字可以四舍五入到的最小“总和” 每个组合中使用的实际数字本身对于这个特定的挑战

  • 问题内容: 我在表中有一列。 我想知道哪种MySQL类型最适合本专栏。难道,或其他什么东西? 价格可以例如:,,(2个位数的小数点后,如在商店)。 请指教。 问题答案: DECIMAL是因为精确存储了十进制值。例如DECIMAL(10,2)非常适合价格不高于99999999,99的价格。MySQL文档参考