遇到的一个追求速度的算法,国外有人控制在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来保存也可以.

这个算法该怎么编写呢?请大家帮帮忙,谢谢啦~~~~~~~~~~~~~~~~~~~~~~~~~
...全文
612 25 打赏 收藏 转发到动态 举报
写回复
用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)
1.算法是程序的灵魂,优秀的程序在对海量数据处理时,依然保持高速计算,就需要高效的数据结构和算法支撑。2.网上数据结构和算法的课程不少,但存在两个问题:1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了2)说是讲数据结构和算法,但大多是挂羊头卖狗肉,算法讲的很少。 本课程针对上述问题,有针对性的进行了升级 3)授课方式采用图解+算法游戏的方式,让课程生动有趣好理解 4)系统全面的讲解了数据结构和算法, 除常用数据结构和算法外,还包括程序员常用10大算法:二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、马踏棋盘算法。可以解决面试遇到的最短路径、最小生成树、最小连通图、动态规划等问题及衍生出的面试题,让你杀其他面试小伙伴3.如果你不想永远都是代码工人,就需要花时间来研究下数据结构和算法。教程内容:本教程是使用Java来讲解数据结构和算法,考虑到数据结构和算法较难,授课采用图解加算法游戏的方式。内容包括: 稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、插入排序、快速排序、归并排序、希尔排序、基数排序(桶排序)、堆排序、排序速度分析、二分查找、插值查找、斐波那契查找、散列、哈希表、二叉树、二叉树与数组转换、二叉排序树(BST)、AVL树、线索二叉树、赫夫曼树、赫夫曼编码、多路查找树(B树B+树和B*树)、图、图的DFS算法和BFS、程序员常用10大算法、二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法马踏棋盘算法。学习目标:通过学习,学员能掌握主流数据结构和算法的实现机制,开阔编程思路,提高优化程序的能力。

33,008

社区成员

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

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