2012-04-24 39 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