Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 这些非比较排序在什么条件下以线性时间运行?_Algorithm_Sorting_Big O_Radix Sort_Bucket Sort - Fatal编程技术网

Algorithm 这些非比较排序在什么条件下以线性时间运行?

Algorithm 这些非比较排序在什么条件下以线性时间运行?,algorithm,sorting,big-o,radix-sort,bucket-sort,Algorithm,Sorting,Big O,Radix Sort,Bucket Sort,我正在探索以下算法: 计数排序 基数排序 斗式分拣 我知道这三种情况在最好的情况下都能以线性时间运行,但我很难理解这些情况何时发生,除了计数排序的情况 以下是我对计数排序的理解,如果可能,我希望其他两种算法的答案: 当希望排序的信息之间没有大的间隔时,计数排序以线性时间运行。例如,1、10^5和545等将创建一个大数组,并且不能有效地使用内存和遍历,因此这将是使用计数排序的“最坏情况”,因此最好的情况是在间隔较小时 如果有人能帮助我理解线性时间出现时基数和桶排序最佳情况的条件,我将不胜感激。让我

我正在探索以下算法:

  • 计数排序
  • 基数排序
  • 斗式分拣
  • 我知道这三种情况在最好的情况下都能以线性时间运行,但我很难理解这些情况何时发生,除了计数排序的情况

    以下是我对计数排序的理解,如果可能,我希望其他两种算法的答案:

    当希望排序的信息之间没有大的间隔时,计数排序以线性时间运行。例如,1、10^5和545等将创建一个大数组,并且不能有效地使用内存和遍历,因此这将是使用计数排序的“最坏情况”,因此最好的情况是在间隔较小时


    如果有人能帮助我理解线性时间出现时基数和桶排序最佳情况的条件,我将不胜感激。

    让我们从独立分析每个算法开始,看看我们是否能够确定它们在线性时间运行的情况

    首先,让我们看一下计数排序。该算法的工作原理如下:

    • 查找要排序的最大整数
    • 创建一个数组,每个整数有一个插槽进行排序
    • 遍历主数组,用每个元素的频率更新第二个数组
    • 通过在输出数组中填充每个元素的适当数量的副本来构造排序数组
    第一步可以通过迭代主数组在时间O(n)内完成。让我们假设数组中的最大值是U。在这种情况下,第二步需要时间O(U),因为我们必须将数组元素归零。第三步需要时间O(n)。最后一步需要时间O(n+U),因为我们只访问频率数组的每个元素一次(O(U)),并对输出数组O(n)进行总共n次写入。这意味着总运行时间是O(n+U)。请注意,这既取决于需要排序的元素总数(较大的数组需要较长的时间进行排序),也取决于数组中元素的大小(较大的数字将按比例需要更多的运行时间)

    如果我们希望这个运行时是O(n),我们需要要求U=O(n)。这样,我们就得到了O(n+U)=O(n+n)=O(n)。这意味着您需要让数组中最大元素的大小以大约与数组长度增长相同的速度增长。例如,如果保证数组中的所有元素都在1范围内。。n、 然后计数排序将需要时间O(n)才能完成。这些元素在该范围内如何分布并不重要


    基数排序基本上是通过反复进行计数排序来工作的,数组中的每一位数字都要进行一次排序。基数排序背后的关键思想是将上一个算法的U值保持在尽可能低的水平。通过选取某个固定的基数,U的值被限制在某个常数上。例如,如果使用二进制基数排序,一次执行一位,则要排序的数组的每个元素基本上都被视为0或1。这意味着每一轮基数排序都需要时间O(n)来完成。然后,对整个数组进行排序所需的轮数由数组中最大数字的位数表示,即Θ(log U)。这意味着算法的总运行时间最终为O(n logu)。再次注意,运行时取决于元素的数量和数组中最大元素的大小

    这一次的优点是logu的增长比U慢得多。例如,2300大约是宇宙中原子的总数,但lg(2300)=300,这相当小

    有些人会声称,在任何固定的计算机上,logu都是一个常数。在32位计算机上,所有整数都是32位的(除非您使用的是任意精度的整数库,我们现在将忽略它),而在64位系统上,所有整数都是64位的。在第一种情况下,日志U=32,在第二种情况下,日志U=64。您可以声称,对于固定系统,基数排序总是需要线性时间,因为运行时将是O(n)。不过,该常数因系统而异。如果你有更高的理论头脑并且想要更精确,你可以说只要log U=O(1),基数排序就以线性时间运行,因为这样O(n log U)=O(n)。这意味着,如果数字中的位数有任何恒定的上限,则可以保证基数排序将在线性时间内运行


    桶排序算法类似于基数排序,只是它使用最高有效位而不是最低有效位来分配元素。这意味着分析与以前几乎相同——只要logu=O(1),算法就以线性时间运行



    希望这有帮助

    基数IIRC始终是线性的,但常数因子是最大整数中的位数。因此,32位基数排序在数据上以32次线性传递运行。对于N<2^32,像mergesort这样的N lg N排序会更快。当你说“线性时间”时,你想要线性化的参数是什么?元素的数量?最大值中的位数?位的总数?@templatetypedef我说的是算法的运行时间。正如法官所说,是的,它们都是线性时间,但我想知道最佳情况是什么时候,运行时间wise@JudgeMental,如果编码正确,基数排序可以在每次传递中处理多个位。@ZAX-对不起,让我试着澄清一下。我知道你说的是运行时,但我很好奇你所说的“线性时间”是什么意思。一个算法可以在元素总数(O(n))上是线性的,或者在最大元素的位数上是线性的(比如,O(n+logu))。你是指O(n)时间吗?