最近我遇到了一个问题,要求在没有任何额外缓冲区的情况下找出字符串中的非唯一字符。我将此问题解释为字符串中的字符的就地排序,然后迭代它以便跟踪非唯一字符。
另一个可以有O(1)空间和O(n ^ 2)运行时的解决方案是在字符串上有两个'for'循环来跟踪常见的任何字符对。
我需要的是使用O(1)空格在至少O(nlogn)时间内对字符串进行排序。
是否有一种简单/优雅的方法在O(nlgn)中使用O(1)空间进行就地排序的字符?
答案 0 :(得分:5)
如何,而不是排序,只扫描字符串以查找多次出现的字符?您可以使用256位来跟踪哪些字符出现一次,另外256位用于跟踪至少出现两次的字符。额外内存总使用量为512位,只有16个32位字,算法以线性时间运行,不会修改原始字符串。
答案 1 :(得分:2)
维基百科上有一个非常好的排序算法比较网格。
http://en.wikipedia.org/wiki/Sorting_algorithm#Comparison_of_algorithms
Heapsort 和 Smoothsort 似乎是您明显的赢家。根据您的语言,您可能已经或可能没有这些语言,但我确信在大多数情况下它们可能都是图书馆。
有一个Java impl,一眼就能宣称能够掌握一套可比的东西 http://www.java-tips.org/java-se-tips/java.lang/heap-sort-implementation-in-java.html
答案 2 :(得分:0)