我有一组作为前缀的元素。我以这样一种方式编写Java方法:每当它获得输入时,验证它属于哪个前缀,如果匹配任何前缀,则返回true或false。 元素是
1900
1901
1902
1903
17082
输入
1900123445
1901334455
1800777777
...
我可以使用哪种数据结构,以便它不会达到性能。因为输入数字将一次达到5000万。
任何人都可以帮助我吗?提前谢谢。
答案 0 :(得分:2)
如果可能,请测试这些方法中的每一种,并查看哪种方法最快。它可能取决于各种因素,我无法真正预测哪一个在您的特定用例中最有效。
最简单的选项:将您的前缀存储在链接列表中,并使用input.startsWith(prefix)
检查每个前缀。无聊。
设k
为最小前缀长度。使用HashMap
,其中键是每个前缀的前k
个数字,项是链接列表包含每个前缀的其余部分。
例如,假设您有前缀abcd
,abce
和xyz
。然后你会存储以下内容:
"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中的任何更快的。
使用switch
声明。或者更确切地说,使用多个switch语句,每个可能的前缀长度一个。例如,假设您有前缀1901
,1902
和20050
:
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之前使用的东西,你可以尝试....
您实际上可以将基数传递给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。