簡體   English   中英

按間隔漢明碼

[英]Hamming numbers by intervals

這是一種基於從序列中一個數字到下一個數字的間隔來生成漢明數字序列(又稱為正數5平滑數字 )的方法,有些不同。 這是上述間隔的示例圖:

在此處輸入圖片說明

因此,數量相對有限的離散間隔將一個數與下一個分隔開,並且隨着H的增加,間隔變小。 人們經常注意到,漢明數隨着大小的增加而變得稀疏,這絕對值是絕對的,但是從另一種意義上(按比例),它們變得更近了。

基本上,隨着H的上升,2 ^ i * 3 ^ j * 5 ^ k的機會更大,其中i,j,k是正整數或負整數,導致分數接近1.0。

事實證明,只有119個間隔(i,j,k三元組)的表涵蓋了大約10 ^ 10000的漢明數。 那是大約前1.59萬億的漢明數字。 這樣的表(C頭文件)按時間間隔大小(從小到大)排序在此處 給定一個漢明數,要查找下一個漢明數,只需找到表中的第一個條目,其中乘法(各個指數的加法)將得出i,j和k為正冪的結果。

例如,百萬分之一的漢明數是2 ^ 55 * 3 ^ 47 * 5 ^ 64,約為5.1931278e83。 之后的下一個漢明數是2 ^ 38 * 3 ^ 109 * 5 ^ 29或大約5.1938179e83。 第一個合適的表條目是:

{-17,62,-35},// 1.000132901540844

因此,盡管這些數字之間相隔約7e79,但它們的比率為1.000132901540844。 要查找下一個數字,在最壞的情況下最多只需嘗試119個條目即可,僅涉及加法和比較(無乘法)。 此外,每個條目只有3個短整數的表需要1kb以下的內存。 該算法基本上是內存中的O(1)和時間上的O(n),其中n是序列的長度。

一種加快速度的方法是,而不是每次都從第0個索引中搜索表,而是將表項列表限制為僅搜索憑經驗已知在給定范圍內成功替換給定項的那些項(n <1.59) E12)。 這些列表在succtab []結構的上方頭文件中給出,例如:

{11 {47,55,58,65,66,68,70,72,73,75,76}},

因此,根據經驗發現該特定索引僅跟隨列出的11個不同的索引,因此僅搜索這些索引。

這樣做可以將算法加速4倍左右, 在此處 (C代碼)與上面的頭文件一起實現。 這是在i7-2600 3.4GHz機器上執行時間的曲線圖:

在此處輸入圖片說明

我認為這可以與最新技術相提並論-是嗎?

漢明問題有時被簡化為僅找到第n個漢明數而不生成所有中間值。 將上述技術應用於僅枚舉所需范圍附近頻帶中的漢明數的公知方案即可得出以下執行時間圖: 在此處輸入圖片說明

因此,只需不到2秒即可找到1.59萬億個漢明數。 這里的C代碼在這里 至少在給定范圍內,這是否也與現有技術水平相稱?

編輯:n的界限(1.59e12,漢明數最多約10 ^ 10000)是基於特定機器選擇的,其中希望i,j,k為短整數,並且對執行速度也有合理的期望。 可以生成更大的表,例如200個條目的表將允許n高達約1e18(Hamming數高達約10 ^ 85000)。

另一個問題是如何進一步加快速度。 一個潛在的領域:事實證明,某些表條目的命中率要比其他表條目高得多,並且它們具有相應更大的后繼列表供檢查。 例如,當生成前1.59e12個數字時,此條目被46%的迭代次數擊中:

{} -7470,2791,1312

它有23個可能的不同后繼者。 也許可以采用一些基於其他參數(例如,遍歷先前條目的歷史記錄)縮小范圍的方法,盡管對於昂貴的操作而言並沒有太大的余地。

編輯#2:

有關生成表的一些信息,基本上有六類分數2 ^ i * 3 ^ j * 5 ^ k,其中i,j,k是正整數或負整數:分子中只有2,3或5的分數,分母中只有2,3或5的分數。 例如,對於分子中只有2的類:

f = 2 ^ i /(3 ^ j * 5 ^ k),i> 0和j,k> = 0

AC程序計算區間此類分數是在這里 對於漢明數字,大約10 ^ 10000,它會在幾秒鍾內運行。 它可能會變得更有效率。

對其他5類餾分重復類似的過程,得到六個列表。 將它們按時間間隔大小排序在一起,然后刪除重復項,即可得出完整的表格。

三元組枚舉為〜n 2/3,但帶的排序為〜n 2/3 log(n 2/3 ),〜n 2/3 log n 即使使用〜n 1/3頻段的空間方案,這顯然也不會改變。

實際上,經驗上的復雜性在實踐中被視為〜n 0.7

我尚未完全理解您的算法,但是您提供的證據強烈表明,純粹的〜n 2/3操作絕對可以對以前的現有技術做出明顯而重大的改進

在此處輸入圖片說明

在我看來,如果需要生成整個序列以找到算法所基於的“間隔”(比率),事實並非如此。 但是由於您是獨立生成它們的,因此正如您以后的編輯所建議的那樣,這完全沒有障礙。

更正 :如果我們只對序列的第n個成員感興趣,則不需要完整的波段; 確實存在O(n)個 選擇數最大的算法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM