[2010-8-17]

  1. 原来在C++的析构函数中是不能再分配堆内存,否则会导致异常。我这样做的原因是我写红黑树结构,在析构时要先析构所有内部树节点,但这个过程如果不想用递归方式的话,则需要一个分配一个栈来完成解除递归的操作。啊~我搞错了,原来没有这回事,真正导致异常的原因是我采用了空节点,这个空节点在递归过程被释放内存了,而且被释放了很多次,因为所有没儿子节点的地方都是链接到这个空节点。我的解决方法是在把左右子节点加入栈前判断是否为空节点。

  2 .在带有旋转节点操作的树中,每个子树内部的总节点数都在动态变化,我今天使用的解决方法是在每次旋转后马上进行树节点数更新,不过不知道有无更有效的方法呢?原来单靠旋转时更新树节点数也不够,因为忽略了存在插入了节点但不需要旋转的情况,必须在每次递归结束前做一次节点数更新,同时配合旋转时更新。这样就可以确保新插入节点的直接父亲能够意识到新节点的存在被将其纳入自己的节点数统计中。

  3.遇到一个设计问题,对于我的红黑树字典,每个字典项自身结构中含有一个列表,我现在打算,如果插入的字典项,其键值(目前为term)已经存在,则树容器内部自动把两个字典项内部的列表合并,合并后刚插入的字典项内部的列表便会被清空。现在的设计问题是我是否应该也在树内部把刚插入的字典项内存销毁呢?但如果这样,可能会导致外部调用程序无法再获取一些关于字典项的数据。好吧,我最后还是决定保持这个设计(即合并后同时销毁刚插入的字典项),因为既然对于新插入的字典项,其内存管理交给字典,那么对于重复插入的字典项,其调用程序也应该理解成由字典管理重复字典项的内存。

  4. 最后还有个小插曲,原来字典项的合并函数有个BUG,就是本地字典项没有posting时,对被合并的字典项合并完成后,没有对其进行清空(就是说被合并的字典项还带有着已经合并到本地字典项去的posting列表),于是就出现了非常奇怪的错误。但错误原因还是没找出来。错误的现象就是,当我插入重复的字典项后,它们的确合并了,但马上posting列表就被销毁了(因为被合并的字典项会自动被字典销毁,伴随着没有被清空的posting列表),然后当我构造一个新的字典项,并加入新的posting,准备第二次重复插入,神奇的事情发生了,我添加posting到还没被插入(合并)的字典项中,但字典里面的对应的本地字典项也拥有这些posting,真是奇怪奇怪。

posted @ 2010-08-24 15:53  DOF_KL  阅读(129)  评论(0编辑  收藏  举报