- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想探讨一下我对桶排序的分析如下。
桶排序有多种实现方式。其中一些如下。
类型 1:
如果我们知道要排序的元素的范围,我们可以设置为每个可能的元素创建桶,然后将元素扔到它们对应的桶中。然后我们按顺序清空桶,结果是一个排序列表。在实现这个算法时,我们可以轻松地使用一个数组来表示我们的桶,其中值在每个数组索引将代表相应存储桶中元素的数量。如果我们有整数在范围 [0..max] 上,然后我们设置一个包含 (max + 1) 个整数的数组,并将所有值初始化为零。然后我们按顺序处理未排序的数组,读取每个元素的值,继续到桶数组中的相应索引,并增加那里的值。
时间:O(N)
空间:O(1)
类型 2:
示例:按年龄对一组人进行排序
年龄与用于排序的任意整数有些不同。因为它的范围很小 [0-150](所有人的年龄都在 0 到 150 之间)。所以最快的排序方法是分配151个链表(我们称它们为桶)并根据他/她的年龄将每个人的数据结构放入桶中:
时间:O(N+K)
空间:O(N+K)
类型 3(type2 的变体,如 Wikepedia 所示)
函数 nextSort 是一个排序函数,用于对每个桶进行排序。如果使用的插入排序比最差的将是 O(n^2) 或将使用合并排序,以便我可以保持比 O(nlgn) 的稳定性。
我的分析基于:
Wikepedia
How could the complexity of bucket sort is O(n+k)?
Design and Analysis of AlgorithmsLecture notes for January 23, 1996
http://www1bpt.bridgeport.edu/~dichter/lilly/bucketsort.htm
http://cs.nyu.edu/courses/fall02/V22.0310-002/lectures/lecture-23.html
How is the complexity of bucket sort is O(n+k) if we implement buckets using linked lists?
What is the worst case complexity for bucket sort?
最佳答案
类型 1:
您描述的第一种类型并不是真正的桶排序。它实际上是计数排序或关键索引计数。尽管它被认为是桶排序的变体。原因是因为您实际上只是在计算每个键的出现次数,而不是将键本身存储在存储桶中。
引用:http://en.wikipedia.org/wiki/Counting_sort
引用:http://www.cs.princeton.edu/courses/archive/spr13/cos226/demo/51DemoKeyIndexedCounting.pdf
Space: O(1)
we can set up buckets for each possible element,
这不是自相矛盾吗?您要为每个可能的元素声明桶并仍然保持 O(1)? ;)
如果你希望算法稳定,你也不能覆盖输入数组。所以在实践中你需要 n + k 的空间要求:
如果您检查计数排序的伪代码,您会注意到最后一个循环再次遍历输入数组以查看每个元素需要到达的位置。通过按照它们在输入数组中出现的顺序执行此操作,您可以获得稳定的排序。
PS:请记住,您不一定要对整数进行排序。如果输入是 A-Z 之间的字符数组,您也可以使用此算法。
类型 2:
So the quickest way to sort it would be to allocate 151 linked lists (let's call them buckets)and put each person's data structure in the bucket according to his/her age:
这可能是最简单的方法,因为您可以很容易地找到所需的存储桶,但这不一定是最快的方法。例如,另一种可能性是每 10 年创建一次存储桶。
00 - 09
10 - 19
20 - 29
...
当你想往桶里插入东西时,你可以这样做:
这样您也不需要事后对桶进行排序,因为所有内容都已排序。并不是说这是一个好主意,只是指出了这种可能性。
问题:
简单地说;它是线性排序,因为排序需要线性时间。类型 1 和类型 2 都采用 O(n + k)。另一个需要考虑的重要因素是桶排序使用的子算法来对每个单独的桶进行排序。如果使用快速排序,与例如冒泡排序相比,它将导致另一个下界。也可以选择具有不同边界的非比较子算法。一个很好的子算法选择和桶上的分布使得 bucketsort 不限于 O(n(log n)) 下限。请记住,O 表示法不提供任何速度保证,它提供增长率保证。如果您的输入大小从“N”加倍到“2N”,您的线性时间算法将比例如冒泡排序这样的 O(n^2)(最坏情况)算法更好地处理它。
插入排序对于小型数组确实很有效,这也是选择它的主要原因。再加上它很稳定。因为如果不使用稳定的算法对桶本身进行排序,则整个算法(桶排序)将不稳定。
很难说。我认为这取决于数据。如果您必须对 100 万个 32 位整数进行排序,则不会为它们创建 2^32 个桶。在这种情况下,最好看看其他算法(例如 LSD Radix 排序),它基本上会创建 9 个桶(每个数字 1 个)。
关于algorithm - 线性排序下如何考虑桶排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16713702/
我一直认为使用“if”比捕获异常要好得多(就性能而言)。例如,这样做: User u = Users.getUser("Michael Jordan"); if(u!=null) System.
我正在尝试使用下一个格式将字符转换为日期。我有下一个数据框 i (我在最后添加了 dput() 版本的数据框): Date 1 Dec_28_2012_9:
考虑到 PHP 中的日期戳,我如何计算持续时间?我在日期之间使用的日期格式是“Y-m-d H:i:s”, 我的工作代码只能计算时间之间的持续时间而不考虑日期。 下面是我的代码: $assigned_t
我正在尝试解释 GLMM 中的自相关。我的响应变量是 bool 值,它表示一组 hive 的生命周期中是否存在 en 事件。我试图用一组描述每个巢状态的数值变量来预测此类事件的概率。因此,我在广义模型
我对如何解释 undefined variable 感到有点困惑(我不确定你现在是否可以)。我正在尝试使用以下代码底部附近的 if else 语句(已注释掉的行)。 这个想法是,如果请求歌曲的人不是与
Bjarne Stroustrup 的 The C++ Programming Language Fourth Edition 中的以下内容是什么意思? "Consider . (dot) suspe
我想要一个主元素,边 block 漂浮在它的右侧。我不知道边 block 的数量,也不知道它们的最终总高度。但是我的主要元素应该具有相同的高度(请参阅以下示例以更好地理解),而无需使用列。 (虚线部分
我在每个 TextView 上都有以下警告(来自 Lint),在我的 XML 中有一个 ID。 Consider making the text value selectable by specify
目前,我有 6 条曲线,以 6 种不同的颜色显示,如下所示。 这 6 条曲线实际上是由 一个相同实验 的 6 次试验生成的。这意味着,理想情况下它们应该是相同的曲线,但由于噪声和不同的试验参与者,它们
winner of a recent Wikipedia vandalism detection competition建议可以通过“检测考虑到 QWERTY 的随机键盘点击来改进检测键盘布局”。 示
多年来,我一直在编写 C 语言,主要是在嵌入式环境中,并且对指针有一个非常好的心智模型——我不必明确地考虑如何使用它们,我对指针算法 100% 感到满意,指针数组,指针指针等。 我写的 C++ 很少,
我正在使用 Boost.Date_time 来获取两个日期之间的时差。我希望代码在这些天也考虑夏令时的变化,并给我正确的时间间隔。 考虑这个例子。 2015 年 11 月 1 日,美国的 DST 将发
我有一个(人类)名字的向量,全部用大写字母表示: names <- c("FRIEDRICH SCHILLER", "FRANK O'HARA", "HANS-CHRISTIAN ANDERSEN")
我想呈现一个表单小部件。这是我要生成的原始 HTML: 使用这个: {{ form_row(form.email, { 'type' : 'email', 'attr' : { 'class' :
我正在开发一个 python 项目,它使用 pythonnet 和几个 C# dll 作为依赖项。 由于我不想将 dll 推送到 git 存储库,因此我调整了 .gitignore 文件。但是,现在
考虑到上午/下午,我想将字符串转换为 php 数据时间。 我想将 '03/06/2015 12:17 am' 转换为 php datatime。 我试过了, $myDateTime = DateTim
我想排除那些具有相同标题和同一年份的实例。 title votes ranking year 0 Wonderland 19 7.9 1931 1
例如对于一个 EditText,通常指定 android:inputType="numberDecimal"用于文本字段应该包含十进制数。但这假设“。”用作小数点分隔符,在某些国家/地区使用“,”代替
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improv
作为练习,我决定学习 Java 中的 lambda 表达式。我想重写我发现笨拙且冗长的旧代码。它检查命令行参数是否是(1)文件路径或(2)目录路径。在(1)场景中,它将命令行参数传递给方法。在 (2)
我是一名优秀的程序员,十分优秀!