2012-04-24 41 views
0

我明白AVL樹如何與整數一起工作..但我很難找出一種方法將字符串插入到一個。如何比較字符串?在C++中插入字符串到AVL樹中?

我以爲只是使用ASCII的總值和排序方式......但在這種情況下,插入兩個相同的ASCII字(例如「tied」和「diet」)似乎會返回一個錯誤。

你如何解決這個問題?我是否以錯誤的方式思考它,並且需要一種不同的方法來對節點進行排序?

不,他們不需要字母或任何東西...只是在一個AVL樹,所以我可以快速搜索它們。

回答

2

使用字符串時,通常使用詞法比較 - 即從每個字符串的第一個字符開始。如果一個小於另一個(例如,「飲食」與「綁定」,「d」小於「t」),則比較基於該字母。當且僅當第一個字母相等時,您轉到第二個字母,依此類推。只有每個字符(按順序)從字符串的開始到結尾相等時,兩者纔是相等的。

+0

'int string :: compare(const string&)const'是一個詞法比較。 – 2012-04-24 23:39:48

1

那麼,由於AVL樹是一個有序的結構,int string::compare(const string&) const例程應該能夠給你一個如何排序字符串的指示。

如果項目的順序實際上並不相關,那麼您可以從無序結構中獲得更好的性能,這樣可以更好地利用您嘗試執行的操作:hash table

將字符串映射到固定大小的鍵稱爲hash function,並且多個鍵映射到相同值的現象稱爲collision。碰撞預計會在散列時偶爾發生,並且需要擴展一個基本的數據結構來處理它,也許通過使每個節點成爲所有項目的「桶」(鏈接列表,向量,數組,所有項)碰撞哈希值,然後線性搜索。

+1

哈希表不一定會比樹更快。這一切都取決於它的大小(當然假設哈希函數是好的)。我的意思是,當你從一開始就沒有關於字符串數量的初步信息時 - AVL樹不是一個不好的選擇 – valdo 2012-04-24 04:42:19

+0

「比較」是一種古老的類似C的方法。 'std :: string'自然支持'operator <',這在我的經驗中更容易理解。 – 2012-04-24 07:44:56

+0

@valdo同意;我個人喜歡AVL樹,但只能使用有序鍵,儘管我發現在實踐中更常用的是紅黑樹。如果順序無關緊要,哈希表爲您提供了更多的空間/速度權衡靈活性,並且如果由於高填充/大桶而導致速度太慢,它們可以調整大小。 – 2012-04-24 23:35:30