Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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
Sorting 我是否应该使用计数排序或任何其他方法对符号的频率进行复杂度排序_Sorting_Assembly_Quicksort_Mergesort_Counting Sort - Fatal编程技术网

Sorting 我是否应该使用计数排序或任何其他方法对符号的频率进行复杂度排序

Sorting 我是否应该使用计数排序或任何其他方法对符号的频率进行复杂度排序,sorting,assembly,quicksort,mergesort,counting-sort,Sorting,Assembly,Quicksort,Mergesort,Counting Sort,我将有一个符号数组(256个ascii符号)和它们的频率数组(一些符号出现的次数为零)。在复杂度方面,使用计数排序进行排序是否更可取,以及什么样的解将占用更多的代码行(代码将在汇编、tasm中编写).如果您的输入很长(字符串或缓冲区明显长于256),则计数排序应该非常好 在复杂性方面,使用计数排序进行排序是否更可取 它当然很容易实现,并且具有O(1)复杂性。如果大的输入是可能的或常见的,计数排序是非常好的 但是,如果小的输入很常见,计数排序仍然需要花费时间清除整个计数数组并再次扫描它,而对于较

我将有一个符号数组(256个ascii符号)和它们的频率数组(一些符号出现的次数为零)。在复杂度方面,使用计数排序进行排序是否更可取,以及什么样的解将占用更多的代码行(代码将在汇编、tasm中编写).

如果您的输入很长(字符串或缓冲区明显长于256),则计数排序应该非常好


在复杂性方面,使用计数排序进行排序是否更可取

它当然很容易实现,并且具有O(1)复杂性。如果大的输入是可能的或常见的,计数排序是非常好的

但是,如果小的输入很常见,计数排序仍然需要花费时间清除整个计数数组并再次扫描它,而对于较小的输入,这一成本并不会降低

根据CPU的不同(例如,清除计数数组的fast memset),使用256个符号进行计数排序可能适合小到64个的输入。您提到了TASM,所以您特别提到了x86,可能还有x86-16。现代x86具有非常快的内存集,使用SSE存储或
rep stosd
。(256或512字节(对于16位计数器)足够大,因此使用
rep stos
并不是一个糟糕的主意;启动开销大部分是摊销的,因此它接近于向量循环的速度。)

在64个元素以下,我不确定qsort或mergesort是否会做得更好。在大约16个元素以下(作为qsort/merge sort的基本情况),您可能需要InsertionSort来提高性能

在具有SSSE3的现代x86上(对于pshufb),您可以使用SSE2 pminub/pmaxub作为具有字节粒度的排序网络中的比较器(是的,这些指令在16位模式下工作)。有关32位元素的详细信息,请参见

或者使用SIMD进行部分排序,这样InsertionSort的交换就更少了。可能只是一些加载、pminub/pmaxub和存储,没有太多或任何混乱

什么样的解决方案需要更多的代码行

在asm中,源代码行是最不有用的度量。(并非每一行都汇编成一条指令;有些是标签或指令)

指令计数有时是相关的,但有些指令比其他指令慢,这关系到您如何排序它们,以及一条指令的输入是否取决于另一条指令的输出

如果您不关心性能,而是关心代码大小,那么您需要查看机器代码的字节数。x86指令是可变长度的

如果只关心代码大小而不关心性能,可以考虑冒泡排序或跳转排序。(无需提前退出检查,只需始终循环最大次数)。看到一个滑稽的慢镜头。只需多几个字节的代码,就可以在不使用

xchg
-和mem(隐式
lock
前缀)的情况下进行交换。看起来更“正常”的冒泡排序实现(TASM用于8位整数)

但是,您也可以只使用几个字节的代码来实现,并且它通常表现良好(与其他O(n^2)算法(如bubble或selection)相比)