- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我到处都读到对于分而治之的排序算法,如 Merge-Sort
和 Quicksort
,与其递归直到只剩下一个元素,不如当达到某个阈值(比如 30 个元素)时,转向 Insertion-Sort
。这很好,但为什么只有 Insertion-Sort
?为什么不用 Bubble-Sort
或 Selection-Sort
,它们都具有相似的 O(N^2)
性能? Insertion-Sort
应该只有在许多元素被预排序时才会派上用场(虽然 Bubble-Sort
也应该有这个优势),但除此之外,为什么它会更高效比其他两个?
其次,在 this link ,在第二个答案及其附带的评论中,它说 O(N log N)
与 O(N^2)
相比表现不佳直到某个 N
。怎么会? N^2
的性能应该总是比 N log N
差,因为 N > log N
对于所有 N >= 2,对吗?
最佳答案
如果您在达到阈值时退出分而治之的快速排序的每个分支,您的数据将如下所示:
[the least 30-ish elements, not in order] [the next 30-ish ] ... [last 30-ish]
插入排序有一个相当令人愉快的特性,你可以在整个数组上只调用它一次,它的性能基本上与你对每个 30 block 调用一次它的性能相同。所以不要在你的循环中调用它,您可以选择最后调用它。这可能不会更快,尤其是因为它通过缓存提取整个数据需要额外的时间,但取决于代码的结构,它可能很方便。
冒泡排序和选择排序都没有这个属性,所以我认为答案可能很简单就是“方便”。如果有人怀疑选择排序可能更好,那么他们就有责任“证明”它更快。
请注意,这种插入排序的使用也有一个缺点——如果您这样做并且分区代码中存在错误,那么只要它不会丢失任何元素,只是错误地分区它们,您将 从不注意。
编辑:显然,此修改是由 Sedgewick 完成的,他在 1975 年获得了有关 QuickSort 的博士学位。最近由 Musser(Introsort 的发明者)对其进行了分析。引用 https://en.wikipedia.org/wiki/Introsort
Musser also considered the effect on caches of Sedgewick's delayed small sorting, where small ranges are sorted at the end in a single pass of insertion sort. He reported that it could double the number of cache misses, but that its performance with double-ended queues was significantly better and should be retained for template libraries, in part because the gain in other cases from doing the sorts immediately was not great.
无论如何,我不认为一般的建议是“无论你做什么,都不要使用选择排序”。建议是,“对于非常小的输入,插入排序优于快速排序”,当您实现快速排序时,这很容易向您自己证明。如果你想出另一种在相同的小数组上明显优于插入排序的排序,那么这些学术资源都不会告诉你不要使用它。我想令人惊讶的是,建议始终针对插入排序,而不是每个来源都选择自己喜欢的(介绍老师坦率地惊人喜欢冒泡排序——我不介意我从不又听说了)。插入排序通常被认为是小数据的“正确答案”。问题不在于它是否“应该”快,而在于它是否确实如此,而且我从来没有特别注意到任何基准消除了这个想法。
寻找此类数据的一个地方是 Timsort 的开发和采用。我很确定 Tim Peters 选择插入是有原因的:他没有提供一般性建议,他正在优化一个库以供实际使用。
关于algorithm - 归并排序为什么要在阈值交叉后使用插入排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12622015/
我正在用 R 编写程序。我卡在这里。 我有像这样的矢量 X=c(84.05, 108.04, 13.95, -194.05, 64.03, 208.05, 84.13, 57.04) 我想在用 180
我正在编写一个应用程序,该应用程序涉及使用手指或手写笔在屏幕上书写。我有那部分工作。在 ACTION_DOWN 上,开始绘制;在 ACTION_MOVE 上,添加线段;在 ACTION_UP 上,完成
我正在尝试构建 OCR 以从图像中提取文本,我正在使用轮廓来形成文本字符的边界, 经过几次更改 cv2.threshold 的试验后,我在形成文本字符的边界时得到了最适合的轮廓。 #files = o
我正在尝试使用 OpenCV 的 cv::threshold函数(更具体 THRESH_OTSU ),只是我想用蒙版(任何形状)来做,以便在计算过程中忽略外部(背景)。 图像是单 channel (必
对于学校项目,我试图用 Python 编写一个程序来跟踪学生的运动。为了做到这一点,我正在使用 OpenCV。 在互联网上查找了一些教程后,我注意到几乎每个人都使用阈值来实现这一点,因为几乎每一步都需
我使用 jest 来驱动 selenium 测试,它报告一个需要 12 秒的测试缓慢(持续时间以红色突出显示)。在这种情况下,12 秒就可以了。 如何将阈值配置为 30 秒? 最佳答案 Jest is
我想找到 list1 中与 list2 中的值足够接近的值(基于指定的阈值),即与下面的代码类似的功能。然而,与 pyhton 的 set 交集相比,下面的 intersect_with_thresh
我正在尝试创建一张图表上有两个系列并带有阈值选项的浮线图。我知道当我只有 1 个系列时如何启用阈值(就像这里 http://people.iola.dk/olau/flot/examples/thre
我已正确应用 d3 (v 4.0) 直方图函数对数据数组进行分箱。我的代码如下所示: var bins = d3.histogram() .domain([data_points_min,
我正在使用带有自然语言全文的 Mysql FULLTEXT 搜索,不幸的是,我遇到了 FULLTEXT 50% 阈值,如果给定的关键字出现在总行数的 50% 时间,则不允许我搜索行。 我搜索并找到了一
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 8 年前。 Improve th
这是我的绘图数据 var data = [{ data: [[4, 80], [8, 50], [9, 130]], color: "r
是否可以制作Canny忽略短边还是忽略低梯度边?在我的例子中,我将卡片放在木头上,并在 canny 之后看到木结构的许多边缘 canny 函数中的两个阈值有什么用? 最佳答案 Large intens
我正在尝试使用 OpenCV 的 cv::threshold 函数(更具体的 THRESH_OTSU),只是我想使用掩码(任何形状) ), 以便在计算过程中忽略外部(背景)。 图像是单 channel
我正在寻找根据提供的音频、频率范围(例如 20hz-1000hz)和阈值缩放 PNG 文件,以获得平滑的效果。 例如,当有脚踢时,比例平滑到 120%,我想让那些音频可视化器,如 dubstep 等.
我正在尝试找到最佳阈值,以使我的逻辑回归具有最高的 f1 分数。但是,当我写下以下几行时: val f1Score = metrics.fMeasureByThreshold f1Score.fore
我使用 Flot 创建了一个实时(每 10 毫秒更新一次)垂直样条图。图表可见here on Codepen 。我包括了 Flot multiple threshold plugin ,但我希望阈值使
我有一个数据框,其中包含从第 1 天到第 7 天的三个人(John、Terry、Henry)的分数。 1 2 3 4 5 6 7
我正在尝试实现多级 Otsu 阈值,更具体地说,我需要 3 个阈值/4 个类。 我知道关于 SO 的 2 个类似问题:#34856019 和 #22706742。问题是我没有得到好的结果:我已经阅读了
The documentation在 THRESH_BINARY 上说: dst(x,y) = maxval if src(x,y) > thresh else 0 这对我来说并不意味着这不适用于彩色
我是一名优秀的程序员,十分优秀!