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 在Θ中对列表进行排序的算法;(n) 时间_Algorithm_Sorting_Time_Analysis - Fatal编程技术网

Algorithm 在Θ中对列表进行排序的算法;(n) 时间

Algorithm 在Θ中对列表进行排序的算法;(n) 时间,algorithm,sorting,time,analysis,Algorithm,Sorting,Time,Analysis,问题是对包含n个不同整数的列表进行排序,这些整数的值范围为1到kn,其中k是一个固定的正整数。设计一个算法,在Θ(n)时间内解决该问题 我不只是想要一个答案。一个解释会有帮助,或者如果有人能给我指出正确的方向 我知道Θ(n)时间意味着算法时间与元素的数量成正比。不知道从那里去哪里 对于固定k容易:创建一个kn计数器数组。将它们全部设置为零。遍历数组,如果数组元素等于i,则将计数器i增加1。使用计数器数组重新创建排序数组 显然,如果k>logn,这是低效的 关键是整数的范围仅为1到kn,因此其长度

问题是对包含n个不同整数的列表进行排序,这些整数的值范围为1到kn,其中k是一个固定的正整数。设计一个算法,在Θ(n)时间内解决该问题

我不只是想要一个答案。一个解释会有帮助,或者如果有人能给我指出正确的方向


我知道Θ(n)时间意味着算法时间与元素的数量成正比。不知道从那里去哪里

对于固定k容易:创建一个kn计数器数组。将它们全部设置为零。遍历数组,如果数组元素等于i,则将计数器i增加1。使用计数器数组重新创建排序数组


显然,如果k>logn,这是低效的

关键是整数的范围仅为1到kn,因此其长度是有限的。这有点棘手:

当我们说排序算法是O(N)时,通常的假设是N的数目适合于一个恒定数量的机器字,因此我们可以在恒定的时间内对该大小的数字进行数学运算。根据这个假设,kN也适合于固定数量的机器字,因为k是一个固定的正整数。因此,您的输入是O(N)个字长,每个字的位数是固定的,因此您的输入是O(N)个位长

因此,任何与输入中的位数成正比的算法都被认为是O(N)

实际上有很多选择,但是当以这种特殊的方式问这个特定的问题时,提问的人通常希望你给出一个基数排序:

MSB first基数排序只是根据整数顶部W位的值将整数划分为2^W个存储桶,然后根据下一个W位对每个存储桶进行划分,以此类推,直到处理完所有的位


这所花费的时间是O(N*(word_size/W)),但正如我们所说的,单词大小是恒定的,而W是恒定的,所以这是O(N)。

我所知道的最好的算法是。如果k=9和N=7,列表看起来如何?@Maertin好吧,我们会看到列表包含7个从1到63的值。我们可以说[10,55,1,23,43,5,20]是列表。我想我不明白为什么我需要从1迭代到kn,而不是从1迭代到n。只有n个数字,为什么我需要制作kn大小的数组?你是说,我应该写“对于i=1到kn do:计数器[i]=0”?如前所述,这取决于k的值,以及kn计数器是否适合内存。如果k太大,那么计数器数组将大部分为零,但即使较慢,它仍然是O(n)时间复杂度。