[英]Hamming number using custom functions instead of prime
漢明問題是一個着名的問題,它基本上產生所有整數,其素數因子只有{2,3,5}。 (它可以擴展到我認為的任何一組素因子)
為了找到第n個漢明數,Dijkstra有一個聰明的O(N)構造算法,偽代碼如下:
List<int> H
int i=0,j=0,k=0, n=10 // find the 10-th hamming number
H.add(1)
for(i=0 to 10)
int next = min(2*H[i], 3*H[j], 5*H[k])
H.add(next)
if(next == 2*H[i]) ++i
if(next == 3*H[j]) ++j
if(next == 5*H[k]) ++k
output(H[10])
該解決方案的關鍵點在於,如果H是漢明數,則2H,3H,5H也是漢明數
我遇到了一個問題 ,我覺得它有點像漢明問題,但它不是使用一組素因子來構造數字,而是如果我重新討論問題陳述,它就像下面這樣:
1在結果集中。 如果H在結果集中,那么2H + 1和3H + 1也在結果集中。 在結果集中找到第n個數字
然后我想知道相同的構造算法是否適用於這個問題,事實證明它確實存在! (我甚至不知道為什么會這樣)
Def f(x) 2x+1
Def g(x) 3x+1
List<int> H
int i=0,j=0,n=10 // find the 10-th hamming number
H.add(1)
for(i=0 to 10)
int next = min(f(H[i]), g(H[j]))
H.add(next)
if(next == f(H[i])) ++i
if(next == g(H[j])) ++j
output(H[10])
那么我想知道:
這個構造算法是否適用於生成數字的問題,給定一個規則,如“如果x
在結果中,則所有f(x), g(x), p(x), q(x)...
也在結果“,只要這些函數給出結果> = x
?
一個充分條件是從整數到整數的所有函數f_i
必須是單調遞增的,並且對於所有i
和n
都具有n < f_i(n)
。
證明你需要類似規則的整數部分的例子是一對函數(n+0.5, (n + floor(n+1))/2)
。 這將導致序列1, 3/2, 7/4, 15/8, ...
並且你永遠不會達到2
。
函數(2^n, 20 - 5n + n^2)
1, 2, 4, 16, 14, ...
的順序出現1, 2, 4, 16, 14, ...
並且顯然不是有序的。 因此需要不減少。
函數(n-3)
給出序列(1,-2,-5,...)並顯示n < f_i(n)
的重要性。
那么為什么這樣呢?
首先,很明顯,該算法輸出的任何內容都在集合中。
換句話說,假設滿足所有三個條件。 然后我們必須通過歸納證明,如果你屬於序列,我們會在到達之前開始尋找你,然后在我們通過你時必須生成它。 (我們通過你的事實是,序列是一組不斷增加的整數。)證明有點混亂,但很簡單。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.