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