2012-03-30 55 views
11

要求:算法生成字符串中唯一的(常量)代碼應該是可逆

我們在DB值一樣

Chennai 
Baroda 
Bangalore 
New Delhi 
São Paulo, Lisboa 
San Jose 

等等

所以我想將這些字符串轉換爲唯一的短字符串。例如,

Chennai –> xy67kr 

San Jose –> iuj73d 

基本上類似於URL縮寫的東西。

而且算法,可將本應是可逆的,即..當我通過「xy67kr」的解碼功能,應該給我回來「奈」。

期待着幫助。

+0

字符串是否需要具有固定長度? – 2012-03-30 08:21:41

+1

如果你有一個數據庫,那麼反轉的處理應該很容易... – 2012-03-30 08:21:51

+0

1 - 字符串不是固定長度。最大長度= 200個字符 2 - 我想避免數據庫調用。這就是我想要生成算法的原因。可以在DB中使用哪些字符串進行編碼。相同的算法可以用於在我的web應用程序中解碼並獲得實際價值 – Taher 2012-03-30 08:22:48

回答

4

正如其他海報說,你不能有縮短任意字符串的函數,這就是數學上是不可能。但是你可以創建一個自定義的函數,它可以很好地適用於你的特定字符串。

一個例子的方法是計算該組中的字頻,然後只用編碼該字符的prefix code使得最頻繁的字母與短前綴編碼(即Huffman coding

上面的方法的確不利用自然語言中的下一個字符可以從以前的字符中很準確地預測的事實,因此您可以擴展上述算法,以便不用獨立編碼字符,而是使用n元語法編碼下一個字符。這當然需要比簡單方法更大的壓縮表,因爲根據前綴,您實際上有單獨的代碼。例如,如果'e'在'th'之後非常頻繁,那麼'th'之後的'e'用非常短的前綴編碼。如果'e'在'ee'之後非常不頻繁,那麼在這種情況下它可以用非常長的前綴進行編碼。解碼算法顯然需要查看當前解壓縮的前綴以檢查如何解碼下一個字符。

這種一般方法假定頻率不會改變,或者至少緩慢改變。如果數據集發生變化,則可能需要重新計算統計信息並對字符串進行重新編碼。

+0

我懷疑這將適用於短輸入數據。似乎OP也想要一種固定長度的編碼,這顯然是不可能的。 – 2012-03-30 13:21:05

+0

@OliCharlesworth相反,即使對於單字符字符串,這種統計編碼也可以很好地工作,即使結果代碼是6位,您仍然必須發送(或保存)至少一個字節。我同意定長編碼是不可能的。 – 2012-03-30 13:48:40

+0

好吧,在我原來的問題中,我問我的輸入字符串可以是可變長度的。因此,假設我通過應用填充使它們具有固定長度,即,使用填充,即 即 - >紐約[變成] - >紐約!@ !! @!或類似的東西。編碼後可以縮短它們嗎? – Taher 2012-04-02 06:10:45

4

my answer到類似的問題,只是它重寫PHP:

編碼:

$encoded = base64_encode(gzdeflate("São Paulo, Lisboa")) 

解碼:

$decoded = gzinflate(base64_decode($encoded)) 

注意gzdeflate執行比gzcompress短串好。

但無論如何,這個問題是,對於短字符串它使串長。這對較長的文本表現更好。 這將是當然更好用一些壓縮算法先驗信息,如100ppm或後綴的方法與最初的後綴樹......那就在短字符串很好地工作也。

+0

是的,我認爲關鍵是這對OP沒有幫助。 – 2012-03-30 09:36:44

+0

當然,使用一些具有先驗信息的**壓縮算法會更好,比如帶有初始後綴樹的ppm或後綴方法......然後它也可以在短字符串上完美工作。但問題是這些方法是否可以在PHP中訪問。 – TMS 2012-03-30 10:07:25

+0

我正在使用C#,而不是PHP :) – Taher 2012-03-30 12:25:07

1

這不一定是確定性的,但顯然你可以使用查找表。該服務將類似於goo.gl或imgur

相關問題