在Java中使用哪种数据结构用于以下场景?

时间:2013-05-02 06:31:00

标签: java

我有一组作为前缀的元素。我以这样一种方式编写Java方法:每当它获得输入时,验证它属于哪个前缀,如果匹配任何前缀,则返回true或false。 元素是

1900
1901
1902
1903
17082

输入

1900123445
1901334455
1800777777
...

我可以使用哪种数据结构,以便它不会达到性能。因为输入数字将一次达到5000万。

任何人都可以帮助我吗?提前谢谢。

5 个答案:

答案 0 :(得分:2)

如果可能,请测试这些方法中的每一种,并查看哪种方法最快。它可能取决于各种因素,我无法真正预测哪一个在您的特定用例中最有效。

选项0(如果前缀很少,请使用此选项)

最简单的选项:将您的前缀存储在链接列表中,并使用input.startsWith(prefix)检查每个前缀。无聊。

选项1(如果有非数字前缀,则使用此选项)

k为最小前缀长度。使用HashMap,其中是每个前缀的k个数字链接列表包含每个前缀的其余部分

例如,假设您有前缀abcdabcexyz。然后你会存储以下内容:

  • "abc" - > ("d","e"),其中("d","e")是包含元素"d""e"
  • 的链接列表
  • "xyz" - > ("")(其中""为空字符串)。

调用此地图prefixes,并使用以下代码确定前缀是否正确:

public boolean correctPrefix(String input){
    LinkedList check = prefix.get(input.substring(0,k))
    if (check != null){
        for (String n : check){
            if (input.substring(k).startsWith(check)) return true;
        }
    return false;
}

我不知道你的目的是否会快速 ,尽管你还没有告诉我们究竟是什么;不过,我不知道Java中的任何更快的

选项2(如果所有前缀都是数字,或者您使用的是SE7,则使用此选项)

使用switch声明。或者更确切地说,使用多个switch语句,每个可能的前缀长度一个。例如,假设您有前缀1901190220050

public boolean correctPrefix(String input){
    int pVal;
    pVal = Integer.parseInt(input.substring(0,4));
    switch (pval){
    case 1901: return true;
    case 1902: return true;
    }
    pVal = Integer.parseInt(input.substring(0,5));
    switch (pval){
    case 20050: return true;
    }
    return false;
}

这将是更多的代码,但我怀疑假设你有足够的前缀具有相同的长度会更快。请注意,如果switch语句没有很多可能的情况,它实际上不会被编译为真正的switch语句,而是编译为一系列if/else块,这将导致它相当慢。不过,你应该对此做些什么,看看你得到了什么;抛出一些虚假的case [wrongprefix]: return false;陈述可能是值得的,因为信不信他们实际上可以加快速度。

实际上,从SE7开始,switch字句可以与字符串一起使用。我不确定这是多么有效,但这是一个选择。

或者,如果你在SE7之前使用的东西,你可以尝试....

选项3(如何作弊)

您实际上可以将基数传递给parseInt,这意味着如果您的前缀但是中有字母,则它们不区分大小写,您可以使用Integer.parseInt(input.substring(0,4),36)来获取一个有效的整数值,然后您可以将其与switch一起使用。

答案 1 :(得分:1)

最好的办法是将前缀存储在HashMap中,值应该是一个链表。我假设相同的前缀可以用各种数字标记,如19011234 190123444。

答案 2 :(得分:1)

前缀的长度是否相同?

如果是这样,您可以散列所有前缀。

当您遇到新输入时,您将提取前x位数。

你会在哈希中找到前x个数字的存在 - 如果哈希设计得好,那就是O(1)操作。

答案 3 :(得分:1)

如果你只有(相对)小整数,你可以使用稀疏的布尔数组,你的前缀将作为索引。

或者,HashSet将是一个不错的选择。

答案 4 :(得分:1)

创建HashSet并在其中添加这4个值。然后解析输入值以获得前四个整数并调用HashSet contains()方法,该方法将返回true / false。