Algorithm O(n)中的MS-Access数据库搜索算法?
问题 考虑到一个包含10000个项目的数据库,我想做以下工作:Algorithm O(n)中的MS-Access数据库搜索算法?,algorithm,ms-access,asp-classic,Algorithm,Ms Access,Asp Classic,问题 考虑到一个包含10000个项目的数据库,我想做以下工作: 按任意列进行搜索 按结果开头的可变字母数匹配结果 打印出重复的结果 该条目的其余信息将附加到搜索中 考虑ms access中的表(省略主键) 由校长进行以下搜索1;苹果、梨 我将收到以下结果: apple, rotten, green apple, fresh, yellow pear, fresh, blue pear, fresh, blue orange, rotten, pink pear, fresh, bl
apple, rotten, green
apple, fresh, yellow
pear, fresh, blue
pear, fresh, blue
orange, rotten, pink
pear, fresh, blue
同样,考虑到Header1的搜索;梨,橘子,梨
我将收到以下结果:
apple, rotten, green
apple, fresh, yellow
pear, fresh, blue
pear, fresh, blue
orange, rotten, pink
pear, fresh, blue
我在做什么
我的方法是存储您正在搜索的头和一个包含您搜索的元素的数组。我检索整个数据库(它很大,所以这不是首选的方法)并按所选的标题对其排序,还对用户给我的输入进行排序(两个列表都以升序排列)
通过使用简单比较(strComp=0,-1,1),我为相应的列表增加计数器变量。但是,这并不能解释用户输入了重复数据,而表格有重复结果的情况。它只解释了其中一种情况
我对这个问题的解决方案是,当我们找到一个结果时,上下“滚动”以检查附近的结果,但这似乎很可怕,也不能解释模糊字符串匹配
有什么建议吗?如果可能的话,解决方案应该保持O(n),因为用户输入可以(也将)大于100000我建议您构建一个动态的
UNION ALL
查询,每个搜索都有一个SELECT
语句
UNION ALL
返回所有行,包括重复行
e、 g
在搜索的列上有索引,这应该相当快。我的解决方案
第一:将数据库中的数据(以逗号分隔)作为值存储在字典中,键是搜索头的值。如果条目已经存在,只需使用条形分隔符将新数据附加到以前的数据中即可
第二:循环输入列表,并将其与字典中的项目进行匹配(必要时,进行简单的前N个字符比较)。如果找到匹配项,则获取值并相应地按分隔符分割
我相信只要不使用前n个字符的比较,这仍然是一个O(n)解决方案。想到的事情:1)精确定义“使用模糊字符串匹配”的含义。2) 数据库是否正确规范化(3NF或更高)?如果不是,理由是什么?3) 你定义了索引吗?4) 它必须是访问数据库吗?有更多功能强大的数据库引擎可用,例如支持全文搜索。5) 从用户的角度描述用例。6) 为什么“pear,fresh,blue”会在第二个搜索结果中出现两次?@Tomalak 1)理想情况下,它会涉及到Levenshtein,但是我要说的是,这不允许出现O(n),所以应该在单词开头设置一个匹配的字母数阈值。2) 不遗憾的是,这些数据都是给我的,而且都是相关的。3) 不,你能详细说明一下吗?4) 是的。。。相信我,我愿意使用任何其他方法5)在excel表格中填写条目上的部分信息(例如:所有姓名,需要额外信息)6)以保持用户输入的数据与他们输入的数据一致1)我看到的。是的,Levenshtein会大大增加工作量。2) 您的数据库是一个单一的平面表吗?3) 索引对列数据进行排序,并允许在该列上有O(log(n))搜索时间(用于精确字符串或字符串搜索的开始)。作为交换,他们增加了数据库的大小。。。数据库旨在尽可能高效地处理SQL查询并只返回匹配的记录。“具有100000个名称的WHERE子句”不在数据库上下文中有任何意义的范围内。所以,要么你误解了数据库是如何工作的,要么我误解了你试图建模的用例。我不禁怀疑,您正在试图用最糟糕的工具解决一个定义相当糟糕的问题。(cc:@Tomalak)-那么,您是说,对于一个约10000行的表,您希望处理“Header\n;term\u 1,term\u 2,…”形式的搜索,其中可能有100000个以上的术语?我很难想象这一点,部分原因是您对Tomalak要求描述用例的请求的响应完全不充分。但我不认为这是一个一次性搜索100000个水果的好解决方案。你会有10万个单独的查询哦,这就是你所说的“10万个输入”的意思。嗯。你可以尝试分块进行,例如,每个查询100次选择,并添加结果,但正如托马拉克所写,这似乎不是一项真正的数据库工作。加快这种方法的方法是在原始数据的基础上构建一个搜索友好的数据结构。这看起来像什么取决于。词典有助于完成这项任务。这是一个有效地分割数据并将其放入与expexted查询格式匹配的有组织层次结构的问题。缓存以供重用,一个超过10000或100000个数据点的搜索树实际上并没有那么多。这就是为什么我说“切片并巧妙地组织”。可以设想字典的层次结构(每列和子字符串长度对应一个字典),字典本身包含行索引数组。可以设想手动构建自定义VBS对象的树。一种混合方法可以将所有关键字索引到长度N,然后使用循环过滤匹配候选项。考虑将字符串规范化为ASCII。这真的要看情况而定。如何:你实现了一些适合你的情况的东西,稍微整理一下你的问题,当你有了一个概念验证解决方案时,你会在自己的答案中分享代码,以利于其他可能是你的人