我有一个正在处理的项目,计划同时在java和ActionScript中实现,因此这就是为什么我标记了这两种语言的原因。
为了完成这个项目,我将需要从给定字典中以给定长度创建一组所有单词。然后,在选择字母后,我需要根据两个字母的位置和字母的频率来创建单词的子集。例如,如果集合包含
{this, time, pate, malt, that, teat, tote}
并且用户选择了字母“ t”,我需要将集合分为以下子集:
Subset 1 (t___) = {this, time}
Subset 2 (__t_) = {pate}
Subset 3 (___t) = {malt}
Subset 4 (t__t) = {that, teat}
Subset 5 (t_t_) = {tote}
对于存在的每个子集(请注意,(_t__)不存在,因此未创建任何子集)。
在这种情况下,哪种数据结构是我的最佳选择?我正在为Java和ActionScript进行编程,因此理想情况下,它将是我可以将其用于两者的结构。但是,如果有必要,我没有完全改变语言之间的数据结构。对于我自己的实践,这两个程序将是单独的实现;不需要跨平台功能。
我考虑过的一些事情:
尝试:通常,当我使用一组单词时,我将节点与Trie一起使用。但是,我认为这种方法不可行,因为没有有效/优雅的方法可以根据字母的位置将Trie拆分成单词。例如,对于在第三个位置而不是在其他任何位置具有特定字母的任何内容,遍历trie的效率将非常低下。因此,我认为尝试不会奏效。
数组:最基本的数据结构。简单易用。我可能可以通过将单词集存储为字符串数组来完成此工作,然后对字符串使用charAt()进行一系列比较,以将其拆分为子集。但是,这看起来也不是很优雅,我想可以使用更好的结构。
ArrayLists:与数组类似的问题。无论如何,我不确定List实现是否会有所帮助。
字典/地图:这些的唯一优点是我以前使用过它们。我真的认为它们根本不适合这种情况。
这是我使用的数据结构。
首先,我使用一些HashSet来存储每组单词。集合使它成为可能,因此您不必担心列表中重复的单词而不必担心每个列表的单词数量。
其次,我使用了HashMap>来映射键/值对。
第三,键是通过将每个单词的charArray中的每个字母与猜测的字母进行比较而动态创建的字符串。如果字符是匹配项,我会附加“ 1”,否则附加“ 0”。这给我留下了一个适当长度的键,该键由1和0组成,分别显示每个字符的数量和位置。
为了对单词进行排序,我为每个单词创建了此键。然后,如果键已经存在于映射中,则将其添加到映射到该键的HashSet中。否则,我将使用包含新单词的新HashSet创建一个新的键值对。
这对我的测试样本大小非常有用。在完成其余代码并确保其可缩放之后,我仍然需要为60000+单词词典运行它,但是当我只处理几百个时,它会非常快速地工作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句