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

时间:2014-10-02 11:38:38

标签: java algorithm

我有7位数字列表。我需要在列表上执行搜索操作。程序的输入将像这个5xx9xx1。至少3位数将是已知的。并且已知数字的索引并不重要。你会建议哪种算法?我不想在数据库中搜索“' like'查询。

2 个答案:

答案 0 :(得分:1)

我能想到的唯一方法是使用一些通配符搜索参数匹配集合上的元素,迭代列表并找到匹配的元素。

如果结果太慢,您也会将列表分开并并行运行。

答案 1 :(得分:1)

我假设您的初始号码列表已排序。如果它没有排序你最好排序它,因为使用排序列表你可以用一个非常直接的算法得到数字。但是,如果这不是时间关键操作,那么最好使用散列表或B-Tree数据结构。 B-Tree可以为您提供log(n)查询时间。它更容易实现。

使用排序列表,如果输入指定搜索的位置和值,即输入显示仅查找具有5,{{1}的数字,则可以直接跳转到正确的元素。 }和9分别位于163位置,您可以直接直接跳转到索引0,而无需查找超出5,000,000的值。

关键的见解在于,如果您在5,999,999位置查找数字(I),并且您在该位置找到第一个这样的数字X,那么下一个连续N个数字将在同一位置10^X-1。在II的下一组号码将位于索引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或某些此类方法,则它们将取决于输入大小。