求助,查询算法

bydpdwz 2003-01-21 05:45:20
这里有一个问题,帮忙想一下。

一个8位十进制数有序表,由小到大。求模糊查询算法
1。找到第一个符合条件的最小数在数组中的位置?
2。找到最后一个符合条件的最小数在数组中的位置?

举例,数组长度为 5

01004101
01010002
02004203
03204004
90089897

条件为:****4***
结果:top=0,bottom=5-1=4

有没有什么好办法,速度要求快,而且内存有限,(递归时要考虑)。
为了考虑方便,可以先解释3位十进制数的查法。

遍历数组可能行不通,因为要有10000条记录

...全文
52 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
bydpdwz 2003-01-25
  • 打赏
  • 举报
回复
问题成功解决,接贴,送分
bydpdwz 2003-01-23
  • 打赏
  • 举报
回复
hoho~,小弟谢谢各位了。这么多注意。

上面是我写错了,是“树的遍历”,rushman(一线天) 兄还把代码写了出来,小弟不乘感激。

上面的方法都有各自的道理,怨我没有把问题说清楚,其实是想和大家讨论这个算法。之所以提出检索速度和堆栈限制,是因为本算法的实现并非在pc机上完成,而是16位单片机。我上面说过的算法基本上已经实现了,但是还没有经过严格的白盒测试,最终使用了32个字节的内存,其中8个在堆栈内。

象rushman(一线天) 所说,“数据量大的时候,影响性能的主要是磁盘I/O。”,但是,遍历肯定会带来大量的数据读取。

我现在的算法简单说就是1*1*1*1*这个数,先对分查出1*******的范围,在此范围内,将第一个*替换为记录集中第一个实际出现的数,比如3,然后再在13******范围内,查131*****,一次类推,查到返回,差不到,将*替换为下一个实际出现的数,比如14******,在此范围内查找141*****。
事实上1*1*1*1*这种苛刻的条件是比较好查的,如果出现*******4这种实际和遍历就差别不大了。
这种算法,各位有什么高见?按照非*数字出现的位数查询,有什么好办法吗?

事实上各种算法都是有长处和短处的,适用于不同特征的数据集,不过我还是愿意大家把想到的算法和各自的优劣说出来讨论 。


rushman 2003-01-22
  • 打赏
  • 举报
回复
--数的遍历怕是不大可能了,因为收到堆栈和数据存储空间的限制。
遍历并不需要多少内存/堆栈空间

--像 1*1*1*1*的情况这样和遍历也差不多了
差多了。首位是"1",概率上只有1/10,而且是连续的。

数据量大的时候,影响性能的主要是磁盘I/O。这要看数据是如何组织的了。

---------------------------------------------------------------
这样查找看看怎么样:
int search(const char * match_str,int & start,int & end,int count)
{
int pos;
start = 0;
end = count;

for(pos = 0;pos < 8;pos++)
{
if(match_str[pos] == '*')//如果是匹配符,忽略
continue;
if(!found_start(match_str[pos],pos,start,end))
return -1;
if(!found_end(match_str[pos],pos,start,end))
return -1;
}
}

//found_end与此类似,只是从后向前搜索
int found_start(char c,int pos,int & start,int & end)
{
//因为将任意的匹配字符串转化成单个字符匹配(还只能处理单字符匹配),
//可以用楼上所说的,利用数字-位置索引进行查找
//我这里简单用遍历进行查找
for(;start < end;start++)
{
//不知道数据是如何存储的,假设是一个数组
if(tbl[start][pos] == c)
return(TRUE);
}
return(FALSE);
}
hnjkserver 2003-01-22
  • 打赏
  • 举报
回复
期待好的答案!!!
马志1993 2003-01-22
  • 打赏
  • 举报
回复
use printf
bydpdwz 2003-01-22
  • 打赏
  • 举报
回复
数的遍历怕是不大可能了,因为收到堆栈和数据存储空间的限制。
原来也是考虑数字的位置,可是没能实现
我现在是这样想的,按照数字的类型进行分快计算,比如上面的 ****4***
分为三个部分,分别查找,先把前面的4个'*'作为一个整体,遍历所有的组合,每一个组合中加上第5位的4,便可以构成一个5位数,以这五位为关键字,查找,若存在符合条件,变完成查找,要是没有,就继续把前面的4个'*',替代为下一个组合,依次查出。

最复杂的情况是出现像 1*1*1*1*的情况这样和遍历也差不多了,各位请提些建议。

yevonn 2003-01-22
  • 打赏
  • 举报
回复
gz
verifylife 2003-01-22
  • 打赏
  • 举报
回复
看看
rushman 2003-01-22
  • 打赏
  • 举报
回复
这个主意实在不错 :D
bugfree 2003-01-22
  • 打赏
  • 举报
回复
using the following: :-)


system("grep ????4???? filename");

your can generate other if you need different pattern string
wonita 2003-01-21
  • 打赏
  • 举报
回复
???
rushman 2003-01-21
  • 打赏
  • 举报
回复
--以数字和在串中位置为索引主键
不错的思路。
更复杂的情况呢?比如类似模式匹配的情况
有没有好办法?(学习)
linhf 2003-01-21
  • 打赏
  • 举报
回复
采用倒排表的方式建立索引,以数字和在串中位置为索引主键,如何建立倒排表去看看算法书吧。
sea_lover 2003-01-21
  • 打赏
  • 举报
回复
利用树的遍历!!!!!
zf0579 2003-01-21
  • 打赏
  • 举报
回复
条件2错啦,我猜应该是:
找到最后一个符合条件的最大数在数组中的位置

如果你的表是静态表,就应该建立必要的辅助方式
就一张的表,数字出现的位置是随机的,不遍历?!
有序性是可以考虑的辅助

rushman 2003-01-21
  • 打赏
  • 举报
回复
有些时候,遍历是必需的。

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧