2012-10-08 30 views
0

是否有任何可能性在非常大的數字部分(超過C/C++中的最大整數類型的最大值,比如2^20)中找到循環長度,而不涉及磁盤去執行它?最好的情況是按順序分析它們,因爲它們是從標準輸入到達的,但我確信這是不可能的,我需要將它們存儲在內存中。但我希望我錯了。數字值是整數,它們來自標準輸入。在非常大的數字序列中查找期間

實施例: 輸入:(1 2 3 ...(2^20個的三元組1 2 3)...... 1 2 3) 期望的結果:3

EDIT

讓我們將週期看作一個週期(f(x)= f(x + t),對於某個t) - 尋找t的值 - 尋找t的值

假設操作存儲器太少而無法存儲所有數字(數字可能大於2^20),可能是gmp類型。

+0

ummmm ......這樣的 「循環」 你的意思是重複子? –

+1

您可能必須解釋爲什麼「3」是您示例中所需的結果。爲什麼不是1? –

+0

因爲3是循環的長度,所以更正 – deha

回答

1

查找週期長度的標準方法是想象您的序列是整數字母表中的字符串S,然後找到最左邊的位置(大於0),其中S可以在字符串SS中找到(級聯的字符串S與自己)。也就是說,如果S = 'abcabc',則必須找到大於零的第一個位置i,以便在字符串SS = 'abcabcabcabc'的位置i中找到S.在這種情況下,這是3,這是期間的長度。

這可以完成任何具有線性性能的字符串搜索算法,並且應該在現代計算機上完美適用於2^20數字。我懷疑你可以避免在內存中保存數字。

+0

正確的,除非你知道字符串是週期性的,並且是週期長度的邊界,否則你必須有整個字符串,否則它可能與最後一個字符斷開。 –

2

這是一個精心研究的問題,與這取決於相當數量的算法,正是你的資源和約束上有:

http://en.wikipedia.org/wiki/Cycle_detection

你並不需要的一切存儲在內存中(只有兩個指針/ index在基本算法中),但是您需要能夠多次訪問序列。

參見:

Floyd's cycle-finding algorithm

+1

這不是OP似乎想要的。循環發現算法假定該序列實際上是循環的 - 即它是通過類似於您所鏈接的維基百科頁面上顯示的遞歸關係來計算的。它會搜索序列中的第一個重複數字,這可能與期間的長度有很大不同。 –

+0

這只是推廣到在序列的開頭有一些垃圾。在維基頁面上使用的符號中,您會發現mu和lambda,而lambda(週期長度)是提問者正在尋找的內容。 – Soverman

+1

問題是,這個算法取決於'x1 = f(x0),x2 = f(x2)'等事實 - 否則它不能正常工作。想象一下序列'1 2 2 1 2 2' - 弗洛伊德算法會報告1或2的週期長度,具體取決於你是直接停在1還是繼續2。兩種長度顯然都是錯誤的。 –

相關問題