Java 算法建议-在数字列表上搜索

Java 算法建议-在数字列表上搜索,java,algorithm,Java,Algorithm,我有7位数的号码表。我需要对列表执行搜索操作。程序的输入将如下5xx9xx1所示。至少3位数字是已知的。而已知数字的索引并不重要。你会建议哪种算法?我不想用“like”查询搜索数据库 我能想到的用一些通配符搜索参数匹配集合中的元素的唯一方法是,遍历列表并找到匹配的元素 如果搜索速度太慢,您还可以将列表分开并并行运行搜索。我假设您的初始数字列表已排序。如果它没有被排序,你最好对它进行排序,因为有了排序的列表,你可以用一个非常简单的算法得到数字。但是,如果这不是一个时间关键的操作,最好使用哈希表或B

我有7位数的号码表。我需要对列表执行搜索操作。程序的输入将如下5xx9xx1所示。至少3位数字是已知的。而已知数字的索引并不重要。你会建议哪种算法?我不想用“like”查询搜索数据库

我能想到的用一些通配符搜索参数匹配集合中的元素的唯一方法是,遍历列表并找到匹配的元素


如果搜索速度太慢,您还可以将列表分开并并行运行搜索。

我假设您的初始数字列表已排序。如果它没有被排序,你最好对它进行排序,因为有了排序的列表,你可以用一个非常简单的算法得到数字。但是,如果这不是一个时间关键的操作,最好使用哈希表或B树数据结构。B树可以为您提供日志(n)查询时间。它更容易实现

使用排序列表,如果输入指定了搜索的位置和值,您可以直接跳转到正确的元素,即如果输入表示仅查找分别在位置
6
3
0
处有
5
9
1
的数字,您可以直接跳转到索引
5000000
,而不必查找
5999999
以外的值

关键的洞察在于,如果您在位置
X
查找一个数字(
I
),并且在该位置找到第一个这样的数字
N
,那么下一个连续的
10^X-1
数字将在同一位置有
I
。在
X
处具有
I
的下一组数字将位于索引
N+10^(X+1)

例如,如果您正在查找位置
2
处带有
5
的数字,并且如果您位于say
10000500
,则您可以将中的下一个
10^2-1(99)
数字作为符合该条件的内容读取。下一组位于位置
10000500+10^3=100001500

在你的问题中,虽然你有多个这样的条件,所以你从最高位置的数字开始,然后进一步向下到较小的位置,跳转到数字集。如果跳转到的下一个集合大于紧邻较高位置的数字所允许的范围,则跳转到较高位置的数字所指的值

例如,如果您正在查找位置
2
5
和位置
1
3
的编号,则从
10000530
开始。下一个
10^1
数字将符合您的标准。下一组
3
单独设置在
10000530+10^2=10000630
,但超出了
5
2
位置设置的限制,即
99
。因此,跳转到由
5
指向的下一个集合,即
10001530


这种方法在时间上是线性的,相对于输出集,所以你可以有一个巨大的输入,如果你的输出很小,这个方法会很快出来。如果使用B-树或类似的方法,它们将取决于输入的大小。

数字是唯一的吗?是的,数字是唯一的,列表大小约为100k到200万。简单算法:迭代所有数字并返回匹配的数字。您的限制条件是什么,您已经尝试了什么?名单上的数字是按顺序排列的吗?你在寻找任何匹配项还是所有匹配项?我会使用a并实现一个算法。这样做如何:将列表中的数字分成不同的集合:第一个位置为1的数字,第一个位置为2的数字,第三个位置为7的数字,等等。一旦你有了这个,剩下的就是寻找集合交点。您将有70个这样的集合,但是如果您必须对同一个数字列表进行多次这样的查找,那么这可能是值得的。