【问题标题】:Best data structure for dictionary in Java (and also Python) [closed]Java(以及Python)中字典的最佳数据结构[关闭]
【发布时间】:2011-04-18 01:57:59
【问题描述】:

这是我的要求:

  • 输入:足够长的随机字符串 ex:fdjhkajajkfdj
  • 输出:fdj 出现 2 次,由 x 字符分隔

我想将所有三个字母的单词放在一个数组中并检查它们是否相同 例如:

a[0] = fdj
a[1] = djh
a[2] = jhk
a[3] = hka
a[4] = kaj
.
.
.
a[n] =fdj

我的答案是a[0]a[n] 匹配,可能出现2 次以上。

问题:那么我应该使用哪种阵列在这种情况下是最佳的。我正在使用 Java(还有 python)。我在想字典。

【问题讨论】:

  • 我认为您的方法可能比简单地遍历字符串并进行查找效率低。你有什么理由需要以这种方式存储三个字母的单词?
  • aaaa 会在 [0] 和 [1] 处返回匹配项吗?如果没有重叠,解决方案会发生变化。在 [3]、[20] 和 [33] 中找到的“aaa”的确切输出是什么?
  • @JoshD:我不必存储任何字母,但只能找到重复项。 @Tony:我想要两个序列之间的距离。所以预期的输出是在 3、20 和 33 处找到的 aaa。

标签: java python


【解决方案1】:

在 Java 中,您可以使用 Map 接口 (http://download.oracle.com/javase/1.4.2/docs/api/java/util/Map.html)

我会使用 HashMap,因此键是 3 个字母的单词,值是出现次数。这是一些示例伪代码

HashMap<String, int> wordCountMap = new HashMap<String, int>();
for(....) // for each 3 letter word in the input
{
    String word = ...; // current three letter word
    if(wordCountMap.containsKey(word))
        wordCountMap.put(word, wordCountMap.get(word)++);
    else
        wordCountMap.put(word, 1);
}

然后您可以遍历键/值对并返回它们的出现次数。

要返回单词之间的字符数,您可以在使用字符串操作计算出现次数后单独执行此操作(请参阅 String.indexOf)。伪代码是......

String orginalInput = "fdjhkajajkfdj";
String word = "fdj";
int firstOccurance = originalInput.indexOf();
int secondOccurance = originalInput.indexOf(firstOccurance+1);
int charsInBetween = secondOccurance - firstOccurance - 3; // difference in indices minus length of word

【讨论】:

  • 这如何返回出现之间的距离?
  • 我喜欢这个。 @AaronMcSmooth:firstOccurance - secondOccurance 将给出距离。谢谢雅各布
【解决方案2】:

在 Python 中,dict 很好。

在 Java 中,如果只需要检测第一个匹配项,则可以使用 HashSet,但如果要计算匹配项的数量,则可以使用 Map

编辑:您更改了问题的参数,所以这就是我现在的建议。使用 Map> - 键是 3 个字母的单词,并且您正在维护字符串出现的索引值列表。您可以在 Python 中使用等价物

【讨论】:

    【解决方案3】:

    您可以对它们进行排序并查找重复项,或者将它们放入链接的哈希集中并在插入内容之前检查是否存在重复项。

    【讨论】:

      【解决方案4】:

      您在数组中存储三个字母单词的方式效率不高。请考虑将字符串存储在后缀树中或简单地存储在数组中,并使用 KMP 算法查找您必须搜索的字符串的最大出现次数。以后可以根据您的选择存储计数。

      【讨论】:

        【解决方案5】:

        嗯。 fdj 将被匹配,因为它是字符串的前 3 个字符?还是来自其他地方?如果您的needle 出现超过 2 次,您需要前 2 场比赛之间的距离,还是第一次和最后一场比赛之间的距离,或者每对比赛的所有距离?

        好吧,我可以给你一个函数,给你所有的匹配。

        >>> def find_matches(needle, hackstay):
        ...   '''returns a list of positions of needle in hackstay'''
        ...   ptr = 0
        ...   found = []
        ...   while True:
        ...     idx = hackstay[ptr:].find(needle)
        ...     if idx < 0: return found
        ...     found.append(ptr+idx)
        ...     ptr += idx+len(needle)
        ... 
        >>> 
        >>> 
        >>> find_matches('fdj','fdjhkajajkfdj')
        [0, 10]
        

        数组的两个元素之间的距离就是较大的元素减去较小的元素减去针的长度。

        例子:

        >>> res = find_matches('fdj','fdjhkajajkfdj')
        >>> distance = abs(res[0]-res[1])-len('fdj')
        >>> print distance
        7
        

        您可以自行决定needle 的来源以及您需要的距离。希望对您有所帮助!

        PS:如果有人可以建议如何改进该代码,请提出!我的感觉是这可以写得更短(比如使用found = [i for ??? if ???]),但我不知道如何。

        【讨论】:

        • 在这种情况下,我需要为每个 a[i] i=0-n 调用函数 find_matches()。如果我有 1000 个字符怎么办?我觉得效率不是很高。
        • 不,你根本不需要a。在我发布的解决方案中, string.find() 会为您找到下一个匹配项。相信我,它的效果与您或我想出的所有解决方案一样有效或更好。
        • 当然我现在明白了,让我试试看。我也使用 Java 中的 Map 实现了。谢谢。
        猜你喜欢
        • 2012-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-08
        • 1970-01-01
        • 2021-01-12
        • 1970-01-01
        相关资源
        最近更新 更多