我想探讨我对桶排序的分析,如下所示
有许多方法可以实现桶排序。其中一些如下
类型1:
如果
时间: O(N)
空间: O(1)
类型2:
示例:按age
age对一个人数组进行排序与用于排序的任意整数有些不同。正因为如此,它的范围[0-150]很小(所有人的年龄都在0-150之间)。因此,最快的排序方法是分配151个链表(让我们称之为桶),并根据每个人的年龄将其数据结构放入桶中:
时间:O(N K)
空间:O(N K)
类型3(如Wikepedia所示类型2的变体)
函数nextSort是用于对每个存储桶进行排序的排序函数。如果使用插入排序,则将使用比最差排序为O(n^2)或合并排序,以便保持比O(nlgn)稳定的排序。
我根据以下内容进行了分析:
Wikepedia
桶排序的复杂性怎么可能是O(nk)
1996年1月23日算法讲稿的设计与分析
http://www1bpt.bridgeport.edu/~dichter/lilly/bucketsort。htm
http://cs.nyu.edu/courses/fall02/V22.0310-002/lectures/lecture-23.html
如果我们使用链表实现bucket,那么bucket排序的复杂性如何
桶排序的最坏情况复杂性是什么?
您描述的类型1和类型2实际上是相同的,意思是您有一个范围。是的,在这种情况下,它是线性时间复杂度,因为在每个桶中不需要进一步排序。每个bucket都包含一种类型的值。
当每个桶在线性时间内排序时,桶排序是线性时间。“类型1”和“类型2”都是线性时间,因为每个存储桶中的所有值成对比较相等,不需要进一步排序。
对后两个问题的答案是实践中可行的。通常,标准库排序的编写器已确定插入排序的适当截止点。我认为bucket sort的性能在很大程度上取决于所讨论的数据和内存子系统。
类型1:
您描述的第一种类型不是真正的桶排序。它实际上是计数排序或键索引计数。虽然它被认为是桶排序的一个变体。原因是您实际上只是计算每个键的出现次数,而不是将键本身存储在存储桶中。
参考:http://en.wikipedia.org/wiki/Counting_sort
参考:http://www.cs.princeton.edu/courses/archive/spr13/cos226/demo/51DemoKeyIndexedCounting.pdf
空格:O(1)
我们可以为每个可能的元素设置桶,
这不矛盾吗?您将为每个可能的元素声明bucket,并且仍然保持O(1);)
如果希望算法稳定,也不能覆盖输入数组。因此,在实践中,您需要以下空间要求n k:
如果您检查计数排序的伪代码,您将注意到最后一个循环再次遍历输入数组,以查看每个元素需要到达的位置。通过按它们在输入数组中出现的顺序执行此操作,可以获得稳定的排序。
PS:请记住,您不一定要对整数进行排序。如果输入是A-Z之间的字符数组,也可以使用此算法。
第2类:
因此,最快的排序方法是分配151个链表(让我们称之为桶),并根据每个人的年龄将其数据结构放入桶中:
这可能是最简单的方法,因为你可以很容易地找到所需的桶,但这不一定是最快的方法;)。例如,另一种可能性是每10年创建一个桶。
00-09
10-19
20-29
...
当您想将某物插入桶中时,您可以执行以下操作:
通过这种方式,您也不需要在之后对桶进行排序,因为所有内容都已排序。不是说这是个好主意,只是指出了可能性
问题:
1)简单地说;这是线性排序,因为如果排序需要线性时间。类型1和类型2都采用O(n k)。因为bucket排序不使用诸如quicksort、bubblesort等元素之间的比较。。。它不受O(n log n)下限的约束。请记住,O符号并不能保证速度,它保证了增长率。如果您的输入大小从'N'加倍到'2N',您的线性时间算法将比例如O(N^2)算法(如冒泡排序)更好地处理此问题
2)插入排序对于小数组来说确实是有效的,这是选择它的主要原因。事实是它是稳定的。因为如果不使用稳定的算法对桶本身进行排序,整个算法(桶排序)就不会稳定。
3) 很难说。我认为这取决于数据。如果必须对100万个32位整数进行排序,则不会为它们创建2^32个存储桶。在这种情况下,不妨看看其他算法(例如LSD基数排序),它基本上会创建9个存储桶(每个数字1个)。
桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。为了使桶排序更加高效,我们需要做到这两点: 在额外空间充足的情况下,尽量增大桶的数量 使用的映射函数能够将输入的 N 个数据均匀的分配到 K 个桶中 同时,对于桶中元素的排序,选择何种比较排序算法对于性能的影响至关重要。 1. 什么时候最快 当输入的数据可以均匀的分配到每一个桶中。 2. 什么时候最慢 当输入
主要内容:桶排序算法的实现思路,桶排序算法的具体实现桶排序(又称箱排序)是一种基于分治思想、效率很高的排序算法,理想情况下对应的时间复杂度为 O(n)。 接下来,我们系统地学习一下桶排序算法。 桶排序算法的实现思路 假设一种场景,对 {5, 2, 1, 4, 3} 进行升序排序,桶排序算法的实现思路是: 准备 5 个桶,从 1~5 对它们进行编号; 将待排序序列的各个元素放置到相同编号的桶中; 从 1 号桶开始,依次获取桶中放置的元素,得到的就是一
事情是这样的。我在做leetcode 164最大间隙。最佳解决方案是桶排序。 这让我对排序问题有了更多的思考。假设我们有如下列表: 2、5、19、444、-14、89、16、77 我认为,我们可以用两个不同的范围来排列这些数字,(min, mid)(mid, max)和mid-应该是min(max-min)/2; 因此我们得到了(-14215)(216444) 我们将min设置为最左侧,max设置
在elasticsearch中,是否有方法使用自定义分数对聚合桶进行排序/排序? 我正在按客户姓名进行扣球。每个客户都有多个订单,其中有一个交货日期字段(DeliveDate)。我想根据与当前日期的距离(接近程度)对桶进行排序。 例如,对交货日期更接近今天日期的客户名进行排序。 非常感谢。
我如何对键上的elasticsearch聚合桶进行排序。我有嵌套的聚合,想对我的第二个聚合桶结果进行排序。 就像我有: 我希望我的< code >事件聚集桶在关键< code >印象或< code >页面视图上按desc/asc排序。我如何实现这样的结果集? 这是我的查询 我试过使用_key,但它在桶内排序。我想通过查看所有桶来排序。就像我有一个键。我希望我的桶结果用这个键排序。不在桶内。 我希望
所以我偶然发现了基于非比较排序的算法桶排序,确切地说,我不知道为什么它是好的。 我有一个想法,但我需要有人来证实。 假设我想对1000个元素数组进行排序。如果它被均匀地分配并扣入10个桶中,每个桶有100个元素。 使用n log(n)算法对100个元素进行10次排序=10*100 log(100)=1000 log(100)=2000 使用n log(n)算法对1000个元素进行排序时=1000