遇到的一个追求速度的算法,国外有人控制在30秒内,我却要6分钟.

hd378 2011-10-12 07:35:55
算法题:通过最快的速度遍历下面黑盒中的字串(字串大于1G),并写入到文件.

内部数据的格式如下:
000000000000000000000000000000000000000000000001111111111111
111111111111111111111122222222222222222223333333333333333333
333300000000000000000000000001111111111111111111111111111122
222222222222333333333333333333333333333300000000000000000001
111111111111111111122222222222222222222222222223333333333333
333333333333333333333333333330000000000000000000000000000001
111111111111111111111111111111111122222222222222222222222222
333333333333333333333333300000000000000000000000001111111111
111111111111111111111112222222222222222222222222222333333333
333333333333333300000000000000000000000000000000111111111111
111111111111111222222222222222222222222222333333333333333333
333333333333333300000000000000000000000000000000000000000000

想获取黑盒里某处的值是多少,调用下面的函数(dwPos最大值等于黑盒中字串的长度).
BYTE GetPosValue(DWORD dwPos);

例如: 结果:
BYTE byVal = GetPosValue(0); byVal == 0;

BYTE byVal = GetPosValue(48); byVal == 1;(第一个1出现的位置是48)

黑盒中每一种数值连续出现的次数不一定是相同的.但即使不同,也不会相差太远.
例如:
不会出现的情况: 某处有10000个连续的1,紧接着出现50个连续的2.
常见的情况 : 某处有10000个连续的1,紧接着出现的2可能在7654--13456之间.


整个遍历过程中,调用GetPosValue这个函数的次数越少越好。


如果存在一种极端的情况:
就是上面提到的 : 某处有10000个连续的1,紧接着出现50个连续2.

这里的50个2可以忽略掉,把它当作它前面的1来保存也可以.

这个算法该怎么编写呢?请大家帮帮忙,谢谢啦~~~~~~~~~~~~~~~~~~~~~~~~~
...全文
620 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
你的程序足够牛吗?还要3个资源分?

[Quote=引用 24 楼 volcano3035112 的回复:]

我发样例程序共享在
http://download.csdn.net/detail/volcano3035112/3690980

有兴趣的朋友可以去看看.
[/Quote]
volcanodeng 2011-10-17
  • 打赏
  • 举报
回复
我发样例程序共享在
http://download.csdn.net/detail/volcano3035112/3690980

有兴趣的朋友可以去看看.
volcanodeng 2011-10-17
  • 打赏
  • 举报
回复
这里的回复好像无法贴附件,我可以共享我的程序.
dragonzht 2011-10-16
  • 打赏
  • 举报
回复
推荐一个思路:试着预测每个串的长度,既然前面说了那么多规律,我想每个串的长度也是有规律的,或者说大部分情况都是有规律的。这样就能根据前面得到的数据预测后面的长度
  • 打赏
  • 举报
回复
围观一下
  • 打赏
  • 举报
回复
假设存在这样的数列
000
222
11111
333
.
.

遍历时把数据存入这样的数组中
id num
1 0
4 2
7 1
12 3
.
.
.
如何查找应该是件很容易的事了~ 一般二分法就可以了~
hd378 2011-10-14
  • 打赏
  • 举报
回复
楼上能给出你的算法参考一下么 = = 谢谢啦 ^_^
volcanodeng 2011-10-14
  • 打赏
  • 举报
回复
只要数据是严格按顺序排列的,我的算法可以完全消除误差,即0误差。

但如果数字顺序出现跳跃,则记录缺失的数字并继续查找。
volcanodeng 2011-10-14
  • 打赏
  • 举报
回复
我的算法支持任意大小的顺序数字,支持任何重复个数的遍历。比如,我可以查找表示16进制数字的字符串,可以查找10000个1后面跟随10个2的特殊方式。

关键是看性能,如果重复个数的区间跨度很大,则遍历查找的次数就会增多。我用的查找方式是二分法或者四分法,或者可以成为N分之一查找法,总之这个查找的缩进递归级数是可配置的,主要看数据组合的规律而定。

根据我的程序模拟测试,发现用2分法查找时,性能还是比较优的,四分法性能不及二分法,但仍可接受,如果改用8分法,则会慢很多。
oo 2011-10-14
  • 打赏
  • 举报
回复
应该要好好用这个属性:
黑盒中每一种数值连续出现的次数不一定是相同的.但即使不同,也不会相差太远.
例如:
不会出现的情况: 某处有10000个连续的1,紧接着出现50个连续的2.
常见的情况 : 某处有10000个连续的1,紧接着出现的2可能在7654--13456之间.


不如第一次间隔是4min-1,如果还是0,则间隔调整到 (4min-1) * 2*(7654/10000),如果还是0,则调整到已知‘0’的长度 *2 * (7654/10000)直到找到非0的数。
hd378 2011-10-13
  • 打赏
  • 举报
回复
"允许一定的误差是每一段都允许呢?还是只能少部分的段允许?"



只能少部分的段允许。实际情况无法接受每一段都有误差的情况。
比如MinTime=3,MaxTime=1000时
0000000000000000011122222222222222233333333333333333444444444444
由于上面的1很少(只有3个),那么即使跳过了也是误差允许的。但是仍然要尽量减少这种误差。
shupo 2011-10-13
  • 打赏
  • 举报
回复
顶一下
oo 2011-10-13
  • 打赏
  • 举报
回复
第一次跳4min - 1,如果还是0,则继续跳3min
如果跳到不是0的,则继续条3min,直到跳到下一个循环,比如又跳到0
这样可以知道一个循环的大致总长度,进一步找分隔点时会更快。
fenix124 2011-10-13
  • 打赏
  • 举报
回复
问题定义不太清楚
jkj9999 2011-10-13
  • 打赏
  • 举报
回复
marks
Oo纳兰筱DoO 2011-10-13
  • 打赏
  • 举报
回复
顶一下,学习一下
  • 打赏
  • 举报
回复
请问楼主,允许一定的误差是每一段都允许呢?还是只能少部分的段允许?

如果错误的字符数总量相等,每一段都有很小的误差和只有几段有误差但是每段误差都比较大,那种情况更不能忍受?
hd378 2011-10-13
  • 打赏
  • 举报
回复
感谢楼上的回答。

“则要求字符串的重复区间最少不能低于7100”。这个我们是没有办法要求设备的,我们只是已知设备上存储的字符串最小重复区间是MinTime,最大重复区间是MaxTime,而且0--4这4个数字是循环重复的。我们现在就是想根据这些字符的重复特性,用最快的办法把它们读出来,并且允许一定的误差。不知道楼上用的是什么算法?
volcanodeng 2011-10-13
  • 打赏
  • 举报
回复
如果把我的程序改写成多线程,则可以在I7的机器上将重复区间的最低要求放低至7100/8=900左右。
volcanodeng 2011-10-13
  • 打赏
  • 举报
回复
我已经写出能在2秒内遍历5000个数字左右的算法,所以如果要将整个字符串遍历的时间控制在30秒内,则要求字符串的重复区间最少不能低于7100。
加载更多回复(5)

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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