嗨,我正在尋找一種算法來將任意有限的一組有限的字符串轉換爲-1和1之間的特定實數,每個字符串都有唯一的實數表示。 這個問題是編程語言不可知的。算法將任何字符串轉換爲-1和1之間的實數
其中每個字符串可以包含許多單詞和結束行,並通過數學定義包含實數。我也可以使用任意精度庫。
嗨,我正在尋找一種算法來將任意有限的一組有限的字符串轉換爲-1和1之間的特定實數,每個字符串都有唯一的實數表示。 這個問題是編程語言不可知的。算法將任何字符串轉換爲-1和1之間的實數
其中每個字符串可以包含許多單詞和結束行,並通過數學定義包含實數。我也可以使用任意精度庫。
假設你希望每個串映射到一個唯一的實數,這也可以被解碼爲原始的字符串,我會用arithmetic coding。
基本上,你想要做的是將-1和1之間的實數集劃分成與你的字母表中的字符數相等的部分數量,n
。要編碼單個字符串,只需選擇其中一個區域的開頭。要編碼字符串的第二個字符,首先找到第一個字符所在的區域,然後將該區域細分爲更小的區域,然後選擇第二個字符所在的區域。然後,您可以對此解決方案進行遞歸,以便能夠將任意長度的字符串轉換爲唯一的實數。
例如,讓我們說我們的拼音是唯一的字符a
和b
,我們希望字符串aba
編碼。第一個a
給我們區域[-1,0)
,第二個字符然後細分此區域,併產生[-0.5,0)
。重複最後的a
以產生區域[-0.5,-0.75)
。 任何在這個區域的數字可以只有被解碼爲序列aba
(假定我們知道原始字符串的長度,或者我們可以在解碼時永遠遞歸)。
(用於編碼和解碼過程的更詳細說明,請參見wikipedia。請注意,你可能只能在相同大小的區域對於這個問題感興趣。)
假設一個字符串是20個ASCII字節或160位。雙精度實數只有64位。所以每個可能的字符串都不能有唯一的實數。另一方面,如果不限於64位,只需在第一位之後放置十進制(二進制)點,將第一位作爲符號,並將字符串的所有位作爲分數。
事實上,如果您將字母表限制爲數字字符0-9,則它已經以COBOL和以前的語言和舊的IBM計算機支持的十進制算術形式存在。 只要把小數點前面,乘以2,然後減去1
這不會給我一個大於1的整數嗎?是的,我有很多精確的圖書館供我使用,沒有限制。 – pyCthon
這假定「\ 0 \ 0」和「\ 0」不是字符串,或者區分它們並不重要。 –
@pyCthon:如果第一個字符串在二進制中是0.11111 ....它是+1減號epsilon。如果是1.0000 ...... 1,則爲-1加上epsilon。 –
[把我的評論到答案。]
你不需要做任何事情。一個字符串可以被認爲是一個實數。每個字符都是小數點後的一個數字,基數爲256(對於8位字符)。
As pointed out,這不能區分具有多個尾隨\0
個字符的字符串。如果這是一個問題,那麼你可以考慮這個數字基數爲257,並且沒有字符映射到值0。
由於沒有算法,沒有額外的內存要求;你的輸入字符串也是你的輸出!任意精度庫沒有問題,等等。
一個字符串已經被認爲是一個實數,以256爲底(假設是8位字符)。所以沒有什麼需要做的。 –
@OliCharlesworth如果您方便地假定字符串在第一個''\ 0''之前停止,這不是非常不依賴語言的。 –
@PascalCuoq:不知道我關注。 –