2013-08-03 33 views
0

我要尋找以下情況最好的數據結構: 在我來說,我將有成千上萬的字符串,但在這個例子中,我明顯的原因要使用兩種。假設我有字符串「水」和「沃爾特」,我需要的是當字母「W」輸入兩個字符串被找到,並且當「Wat」輸入「水」時唯一的結果。我做了一個研究,但是我仍然不確定哪個是這個案例的正確數據結構,如果我不確定這會浪費時間,我不想執行它。所以基本上我現在的想法是「Trie」或「Suffix Tree」。看起來「Trie」會做到這一點,但正如我所說的,我需要確定。另外,實現不應該是一個問題,所以我只需要知道正確的結構。如果有更好的選擇,也請隨時告訴我。正如你可以猜到,像Dictionary/MultiDictionary這樣的普通結構不會工作,因爲這將是一個記憶殺手。我也計劃實施緩存來限制內存消耗。我很抱歉沒有代碼,但我希望我能得到答案。先謝謝你。數據結構進行搜索字符串

+0

這聽起來像你想建立某種自動完成功能。我會看看是否有一些可以使用的東西,而不是滾動自己的東西。 – Tim

+0

您打算使用泛型? –

+0

我的情況有點特殊,我找不到任何可以解決問題的方法。這裏的解釋很淺。 –

回答

2

你應該用戶Trie。嘗試是已知最快的排序算法(burstsort)之一的基礎,它也用於拼寫檢查,並用於使用文本完成的應用程序。你可以看到詳細信息here

+0

謝謝大家,我的Trie現在工作很好。 –

1

實際上,如果你想要做的自動提示,然後存儲高達3-4個字符就足夠了。 我的意思是建議爲,當用戶鍵入「A」或「AB」或「ABC」和他類型的「ABCD」或更多的字符,你可以使用開始「ABCD」使用C#語言支持LAMDA表達式map.keys的時刻。

因此,我建議建立一個地圖,如: 地圖<焦炭,<地圖<焦炭,地圖<焦炭,設置<串>>>>>地圖; 因此,如果用戶輸入「a」,則查找地圖[a]並找到所有的孩子。

+0

這看起來非常不現實和限制,我需要實現我自己的結構,因爲它必須使用3-4個類(1個抽象)。 –

+0

基本上,如果你想在一個簡單的方法來實現,那麼你可以使用C#語言提供的結構,如LAMDA表達式來過濾根據您的需求是這樣的數據:
map.keys.select(K => {返回k.startsWith (「USER_INPUT」);因爲他們迭代收集和我提到,我將有成千上萬的條目}
不確定確切的語法 – BVMR

+0

Lambda表達式是緩慢的關於您的文章=>這種方式是內存殺手,形象。它與成千上萬的長字符串,這是我的第一個想法,但經過一些計算後,它顯示自己非常非常糟糕的想法。 –