这是一项家庭作业,并不是那么难,只是我的理解可能有缺陷。
所以我有两个链接列表:双向链表和自定义链表。我们只关注两个函数: void add()和 boolean contains()。
MyLinkedList扩展了AbstractList并且函数不受影响,但是自定义的LinkedList扩展了MyLinkedList,覆盖了contains()方法,这样当查找一个元素时,它总会被移动到前面您知道,该列表可以改善更频繁使用的单词的查找时间。
它还会覆盖 add()方法,以便项目不会添加到列表的后面,而是添加到其前面。
我有一个 dictionary.txt文件,这是一个包含(~10000字)的字典。
程序的作用是创建MyLinkedList对象和自定义链接列表对象,并将 dictionary.txt 单词添加到相应列表中。所以这应该意味着在MyLinkedList中单词是有序的,而在自定义链表中它们是相反的顺序。
然后程序接收txt文件,例如romeo-and-juliet.txt并遍历该txt文件的前10000个单词(如果单词与MyLinkedList对象中的单词匹配,并为自定义链接列表对象单独运行。)
问:为什么自定义链表比MyLinkedList运行得快?我的答案是,由于自定义链表将常用的搜索词移到前面,查找时间较短,因此运行速度比MyLinkedList快。我希望我的回答听起来不错,随时可以改进。
现在令人费解的是,现在我们正在使用romeo-and-juliet.txt作为字典文件本身,这就是:
即。最短时间到最长时间:
MyLinkedList使用romeo-and-juliet字典~80ms
在dictionary.txt~160ms上自定义列表
在dictionary.txt上的MyLinkedList~360ms
romeo-and-juliet字典上的自定义列表~190ms
问:为什么会这样?如果我们只使用故事中的单词作为字典的范围,为什么自定义链表更慢?
P.S。如果问题的任何部分不清楚,请随时告诉我,我会编辑我遗漏的任何内容。
答案 0 :(得分:0)
由于自定义列表总是在前面添加单词,因此字典将按照与读取术语的顺序相反的顺序排列。对于不会产生很大差异的普通字典,但是当您使用时罗密欧与朱丽叶本身作为字典的文本,这就是你最终的结果:
Romeo and Juliet
:"两个家庭,都有尊严......比朱丽叶和她的罗密欧都要好。"
MyLinkedList
:"两个","家庭","两者","类似"," && #34;,"尊严",......
custom list
:"罗密欧","她","","朱丽叶","& #34;,"这","比",...
由于您按顺序搜索R& J的文本,当您使用R& J字典搜索MyLinkedList
时,第一个单词将始终位于第一个位置,第二个单词将始终发现可以在第二个位置找到,依此类推,作为最差的查找,如果该单词已经出现在游戏中,则更快。
这比在正常字典中查找每个单词要快得多 。
现在让我们考虑一下您开始搜索custom list
时会发生什么。你要搜索的第一个单词是字典中的最后一个单词,如果它在剧中出现不止一次,则更早。然而,与你搜索MyLinkedList
时相比,找到它肯定需要更长的时间。然后,更糟糕的是,你将这个词移到字典的前面,推动着名的'在搜索之前,第二个单词的位置到字典的最末尾。这会在一定程度上减轻,因为常见的词汇(例如" a","","和")会向前冒泡,但它不会赢得克服了MyLinkedList
搜索带来的巨大优势。