[算法征集]内存搜索之百里挑'一',限C\C++

microsoft_feedback 2011-06-06 06:25:17
目标:写一个函数,实现搜索内存中指定长度的连续内容的功能。


格式:
函数头定义如下。
C/C++ code
void *findptr(void *p, int n, int s)

p可视为整型数组(int num[4096 * e], 其中e >= 1, 如int num[] = {1, 2, 2, 2, 3, 4, 4})的指针,不一定指向数组开始(即i[0]).
n为用户指定的欲搜索的整型(4字节).
s为用户指定的最少连续次数.
没有符合条件的结果即溢出时(不提供指针所指内存的长度,请自行使用IsBadReadPtr判断)返回NULL.


要求:
* 用C或C++语言实现,可以使用系统库,但不得使用任何其它辅助函数或类。
* 从p指向的内存地址开始,搜索重复s次的n,并返回首地址。


评判标准:
* 算法准确,稳定,无异常
* 效率较高

示例:

void *findptr(void *p, int n, int s)
{
PINT &i_p = (PINT &)p;//视为整型数组指针
while(true)
{
if (IsBadReadPtr(i_p, sizeof(int)))
{
return NULL;
}
if (*i_p == n)
{//找到第一个n, 还差 s-1
for (int k = 0; k < s - 1; k++)
{
i_p += 1;//p += sizeof(int);
if (IsBadReadPtr(i_p, sizeof(int)))
{
return NULL;
}
if (*i_p != n)
{
goto next;//不符合连续要求,寻找下一个n
};
}
return i_p - (s - 1);//p -= s * sizeof(int);
}
next:
i_p += 1;//p += sizeof(int);
}
}
...全文
252 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
push0714 2011-06-13
  • 打赏
  • 举报
回复
mark一下。
RLib 2011-06-12
  • 打赏
  • 举报
回复
仅供参考:
BM算法
KMP算法
CsharpGame 2011-06-11
  • 打赏
  • 举报
回复
关注此贴!
hemiya 2011-06-11
  • 打赏
  • 举报
回复
等高人
ryfdizuo 2011-06-06
  • 打赏
  • 举报
回复
lz,你给出一个测试例子。。。
IsBadReadPtr没那么有效的。
5t4rk 2011-06-06
  • 打赏
  • 举报
回复
楼主
我表示关注
ryfdizuo 2011-06-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 microsoft_feedback 的回复:]

引用 4 楼 dizuo 的回复:
引用 3 楼 microsoft_feedback 的回复:

引用 2 楼 dizuo 的回复:
lz,你给出一个测试例子。。。
IsBadReadPtr没那么有效的。


IsBadReadPtr只是用来Debug里有用的,关键是搜索算法的优化。

只在debug下面有用的函数有意义吗? 还是增加一个数组长度信息先保证安全,再谈效率,算……
[/Quote]
常规思路,每次查找都得一次遍历,O(n)

template<int length>
int* findptr(int (&pbuf)[length], int val, int times)
{
int count = 0;
for (int* beg = pbuf; beg < pbuf+length; ++beg)
{
if (val==*beg) // 找到元素
{
++count;
} // if
else
count = 0;

if (count==times)
return beg-times+1;
} // for

return NULL;
}

数组中数据非常有规律,可以使用行程编码的思路建立一个索引表:
5555557777733322221llllll
行程编码为:(5,6)(7,5)(3,3)(2,4)(l,7)
行程编码的位数远远少于原始字符串的位数。建表以后查询效率会很高。
希望对你有帮助。
microsoft_feedback 2011-06-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 dizuo 的回复:]
引用 3 楼 microsoft_feedback 的回复:

引用 2 楼 dizuo 的回复:
lz,你给出一个测试例子。。。
IsBadReadPtr没那么有效的。


IsBadReadPtr只是用来Debug里有用的,关键是搜索算法的优化。

只在debug下面有用的函数有意义吗? 还是增加一个数组长度信息先保证安全,再谈效率,算法~
[/Quote]

这点你不用考虑,我只要算法,所谓数组只是方便理解,其它我自己会搞定的。谢谢
ryfdizuo 2011-06-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 microsoft_feedback 的回复:]

引用 2 楼 dizuo 的回复:
lz,你给出一个测试例子。。。
IsBadReadPtr没那么有效的。


IsBadReadPtr只是用来Debug里有用的,关键是搜索算法的优化。
[/Quote]
只在debug下面有用的函数有意义吗? 还是增加一个数组长度信息先保证安全,再谈效率,算法~
microsoft_feedback 2011-06-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dizuo 的回复:]
lz,你给出一个测试例子。。。
IsBadReadPtr没那么有效的。
[/Quote]

IsBadReadPtr只是用来Debug里有用的,关键是搜索算法的优化。

64,434

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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