数据结构和算法 - IOS 关键字过滤
大家讲道理
大家讲道理 2017-04-17 13:59:08
0
1
388

项目需要添加一个关键字过滤的功能,基本思路如下:

1.从服务器获取关键字数据,根据首字母保存到关键字字典
(key->关键字首字母,value->相同首字母的关键字的数组
2.获取用户输入字符串,从左侧截取字符,取得字符首字母,
并在关键字字典中匹配对应的数组
3.从右侧截取字符,于2中取得的数组进行折半查询
4.如查询到关键字,替换关键字为等长*

但实际应用中对于过长的字符串效率太低
想问问大家有没有什么好的方法
正则表达式是现在已知的比较好的方法,可是实在是写不出来。。。

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回覆(1)
Ty80

我感覺你描述的是不完整的字典樹。資料組織的結構:

(key->關鍵字首字母,value->相同首字母的關鍵字的陣列)

以及這一步驟:

從右側截取字符,於2中取得的數組進行折半查詢

讓我覺得比較奇怪,不明白為什麼要這樣。

我覺得有兩種做法可以改進:

第一種做法:字典樹

要在原有的基礎上改進,可以實作字典樹。從伺服器取到的關鍵字數據,根據首字母分成各個分支,每個分支根據第二個字母再分成各個分支,每個分支根據第三個字母再分成各個分支……

也就把你描述的資料結構改成了

(key->关键字首字母,value->(key->第二个字母,value->(key->第三个字母,value->()),……))

查詢的時候先按第一個字母查,進入某個分支,然後按第二個字母進入某個分支,然後第三個字母… 直到查到/查不到為止。

這樣建立樹需要一些時間,但是查詢是非常快的。最長的字串有多少個字母,就最多需要多少次查詢,也就是查詢的速度與關鍵字的個數沒關係了。

第二種做法:Hash

我覺得上面的做法還是挺麻煩的,為何不 Hash 一下呢?把伺服器取到的每個關鍵字(完整的,不分字母了)保存在 Hash 數組裡(在 iOS 裡的NSDictionary裡即可),然後把用戶輸入直接查一下就行了唄?這樣不是最方便、最快的嗎?

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!