免责声明:关于它有很多问题,但我没有找到任何需要恒定记忆的问题。
汉明数是一个数字2^i*3^j*5^k
,其中i,j,k是自然数。
是否有可能在O(N)时间和O(1)(常数)存储器中产生第N个汉明数?在生成下我的意思是确切的生成器,即你只能输出结果而不能读取先前生成的数字(在这种情况下,内存不会是常数)。但是你可以保存一些常数。
我看到只有具有常量内存的最佳算法并不比O(N log N)好,例如,基于优先级队列。但有没有数学证明在O(N)时间内构造算法是不可能的?
答案 0 :(得分:4)
这里要考虑的第一件事是直接切片枚举算法,例如可以看到in this SO answer,枚举序列成员的给定对数值( base 2 )附近的三元组(k,j,i)
,以便target - delta < k*log2_5 + j*log2_3 + i < target + delta
逐步计算累积对数选择j
和k
时,i
直接知道。
因此 N 2/3 时间算法产生 N 2/3 - 宽切片一次的序列(k*log2_5 + j*log2_3 + i
接近目标值,因此这些三元组形成tetrahedron填充Hamming sequence三元组 1 的the image from Wikipedia的外壳,表示 O(1)每个生成数字的时间,从而在 O(N) 摊销中生成 N 序列成员时间和 O(N 2/3 ) - 空间。与具有相同复杂性的基线Dijkstra算法 2 相比没有任何改进,即使非摊销且具有更好的常数因子。
要使它成为 O(1) - 空间,随着我们沿着序列前进,需要缩小地壳宽度。但是地壳越窄,在列举它的三元组时就会有越来越多的失误 - 这几乎就是你要求的证明。对于整体 O,常量切片大小意味着每个 O(1)切片的 O(N 2/3 )工作( N 5/3 )摊销时间, O(1)空间算法。
这是这一范围的两个终点:来自 N 1 -time, N 2/3 -space到 N 0 空间, N 5/3 -time,摊销。
{{3}}
这基本上是汉明序列三元组(i,j,k)
的四面体,在空间中伸展为(i*log2, j*log3, k*log5)
,从侧面看。如果图像是真正的3D图像,则图像有点歪斜。
编辑: 2 我似乎忘记了必须对切片进行排序,因为它们是由 j,k -enumerations。这改变了通过切片算法按顺序生成序列的 N 数字的最佳复杂度 O(N 2/3 log N) time, O(N 2/3 )空间,使得Dijkstra的算法在那里成为胜利者。对于 O(1)切片,它不会改变 O(N 5/3 )时间的上限。