O(n)中的MS-Access数据库搜索算法?

时间:2015-12-16 13:58:43

标签: algorithm ms-access asp-classic

问题

鉴于有10,000个项目的数据库,我想继续做下面的事情:

  1. 按任意列搜索
  2. 通过结果开头的可变数量的字母匹配结果
  3. 打印出重复的结果
  4. 该条目的其余信息将附加到搜索
  5. 考虑ms-access中的表(省略主键)

    Header1|Header2|Header3
     apple   rotten  green
     apple   fresh   yellow
     pear    fresh   blue
     orange  rotten  pink
    

    通过 Header1 进行以下搜索;苹果,梨

    我会收到结果:

     apple, rotten, green
     apple, fresh, yellow
     pear, fresh, blue
    

    同样,给定 Header1 的搜索;梨,橙,梨

    我会收到结果:

     pear, fresh, blue
     orange, rotten, pink
     pear, fresh, blue
    

    我在做什么

    我的方法是存储您要搜索的标头以及包含您搜索的元素的数组。我检索整个数据库(它很大,所以这不是首选方法)并按所选标题排序,并对用户给我的输入进行排序(两个列表按升序排列)。

    通过使用简单的比较(strComp = 0,-1,1),我增加了相应列表的计数器变量。但是,这并未考虑用户输入重复的情况并且表具有重复结果。它只涉及这些案件中的一个或另一个。

    我对这个问题的解决办法就是当我们找到一个检查附近结果的结果时“上下滚动”,但这看起来很糟糕,也不能解决模糊字符串匹配问题。

    有什么建议吗?如果可能的话,解决方案应该以某种方式保持O(n),因为用户输入可以(并且将)是> 100,000

2 个答案:

答案 0 :(得分:1)

我建议您构建一个动态recs->id查询,每次搜索都有一个UNION ALL语句。

SELECT返回所有行,包括重复行。

e.g。

UNION ALL

对于要搜索的列的索引,这应该相当快。

答案 1 :(得分:0)

我的解决方案;

首先:将数据库中的数据(以逗号分隔)存储在字典中作为值,其中键是搜索头的值。如果条目已存在,只需使用条形分隔符将新数据附加到先前的数据。

第二步:循环输入列表并将它们(使用简单的前N个字符比较 - 如果需要)与字典中的项目进行匹配。如果找到匹配项,请获取值并相应地按分隔符进行拆分。

我认为只要不使用前N个字符比较,这就是O(n)解决方案。