我的词典中有300000个单词(实际上是以我的Android设备的SD卡格式保存为txt格式(新行分隔))。 我想构建一个数据结构,尽可能减少从这个数据结构中的txt文件中插入单词(String-s)。并且这个DS必须超级快速,以检查字典(此DS)中是否存在单词。 我尝试了几个内置DS,最快的IMO是TreeSet。是否有任何其他(非内置)DS在插入/创建DS方面更快,与TreeSet相同以进行搜索?
还有一件事是我可以通过重新排列来帮助TreeSet更快地插入 我的txt文件(按正确顺序放置单词)。
此致
答案 0 :(得分:5)
首先,在试验中找到适合您应用的最佳结构。通常人们会争论不试用各种方案来获得真实的绩效数据。
如果您想节省构建时间,并且您的文字文件不会经常更改,那么明显的构建速度改进就是缓存数据结构。无论您使用何种数据结构,都要构建一次结构,然后将结构存储到SD卡(而不是仅存储字符串)。可以使用Serialization存储标准java.util结构。
如果您想要最快的构建时间,并且您的单词列表按字母顺序排序,或者可以,那么您可以只存储在String数组中。构建时间将非常快,搜索时间将类似于TreeSet(使用Arrays.binarySearch())。
如果您想要更快的查找,您可能需要查看Perfect Hash或Trie,但这些不在Java标准库中。
trie将比其中任何一个都更加节省内存,这可能会更快。 (Information on finding an implementation)
我很惊讶TreeSet在实验中比HashSet更快,这意味着您可能在内存分配昂贵的情况下运行。您是否记得在分配HashSet时设置初始容量?请记住避免昂贵的rehash,您需要将初始容量设置为至少项目数/ 0.75(负载系数)。