我有7位数字列表。我需要在列表上执行搜索操作。程序的输入将像这个5xx9xx1。至少3位数将是已知的。并且已知数字的索引并不重要。你会建议哪种算法?我不想在数据库中搜索“' like'查询。
答案 0 :(得分:1)
我能想到的唯一方法是使用一些通配符搜索参数匹配集合上的元素,迭代列表并找到匹配的元素。
如果结果太慢,您也会将列表分开并并行运行。
答案 1 :(得分:1)
我假设您的初始号码列表已排序。如果它没有排序你最好排序它,因为使用排序列表你可以用一个非常直接的算法得到数字。但是,如果这不是时间关键操作,那么最好使用散列表或B-Tree数据结构。 B-Tree可以为您提供log(n)查询时间。它更容易实现。
使用排序列表,如果输入指定搜索的位置和值,即输入显示仅查找具有5
,{{1}的数字,则可以直接跳转到正确的元素。 }和9
分别位于1
,6
和3
位置,您可以直接直接跳转到索引0
,而无需查找超出5,000,000
的值。
关键的见解在于,如果您在5,999,999
位置查找数字(I
),并且您在该位置找到第一个这样的数字X
,那么下一个连续N
个数字将在同一位置10^X-1
。在I
处I
的下一组号码将位于索引X
。
例如,如果您要查找N + 10 ^ (X+1)
位置5
的数字,如果您说的是2
,那么您可以阅读下一个10000500
数字作为符合该条件的东西。下一组位于10^2-1(99)
位置。
在你的问题中,虽然你有多个这样的条件,所以你从最高位置的数字开始,然后往下走到较小的位置并跳转到数字集。如果您跳转到的下一个设置大于位于更高位置的数字所允许的范围,则跳转到更高位置处的数字指向的值。
例如,如果您要查找10000500 + 10^3 = 100001500
位置5
和位置2
3
的号码,请从1
开始。下一个10000530
号码将符合您的标准。仅10^1
的下一个集合将位于3
,但超出10000530 + 10^2 = 10000630
位置5
设置的限制,即2
。所以你跳转到99
指向的下一个集合,即5
。
这个方法在时间上是线性的,w.r。到输出集,所以你可以有一个巨大的输入,如果你的输出真的很小,那么这个方法会非常快。如果您使用B-Tree或某些此类方法,则它们将取决于输入大小。