免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: Go_To_CU
打印 上一主题 下一主题

如何提高查找速度 [复制链接]

论坛徽章:
0
51 [报告]
发表于 2005-09-19 12:43 |只看该作者

如何提高查找速度

原帖由 "mq110" 发表:


你的思想总是十分的开阔. 每次都让我有耳目一新的感觉.
呵呵 学习.


在下也着实对兄台仰慕得紧啊!

才来cu不久,已经被这里的高手们的招数弄得头晕目眩了,
这里永远都不缺乏值得自己学习的东西,我也继续学习ing!

论坛徽章:
0
52 [报告]
发表于 2005-09-19 12:54 |只看该作者

如何提高查找速度

不能修改最后一个的值,这个串一般是个const的
(1)串长可能为0
(2)如果是个字符串常量,这个修改可能会造成core dump
(3)如果这个串是静态的,则是线程不安全的,存在溢出的风险

论坛徽章:
0
53 [报告]
发表于 2005-09-19 12:58 |只看该作者

如何提高查找速度

咱家也写了一个
思路参考前面某些人的讨论
array前面的大部分都用int来判断
剩下的不足一个int长的就用char来判断

  1. #include "../my.h"
  2. int empty_array(char *array, int size)
  3. {
  4.         int num = size / 4, i;
  5.         int *p = (int *)array;
  6.         for(i = 0; i < num; i++) {//用32位来判断
  7.                 if (*p++ != 0)
  8.                         return 0;
  9.         }
  10.         num = size - num * 4;
  11.         for(i = 0; i < num; i++) {//最后的尾巴用char来判断
  12.                 if (*array != '\0')
  13.                         return 0;
  14.         }
  15.         return 1;
  16. }

  17. int main()
  18. {
  19.         char buf[99];
  20.         bzero(buf, 99);
  21.         //buf[60] = 'a';
  22.         printf("buf is%s a empty array!!\n",
  23.                empty_array(&(buf[0]), sizeof(buf))?"":" not");

  24.         return 0;
  25. }
复制代码

论坛徽章:
0
54 [报告]
发表于 2005-09-19 13:03 |只看该作者

如何提高查找速度

num = size - num * 4;
换成
num %= sizeof(int);

论坛徽章:
0
55 [报告]
发表于 2005-09-19 13:09 |只看该作者

如何提高查找速度

你的意思是num = size % sizeof(int)吧

论坛徽章:
0
56 [报告]
发表于 2005-09-19 13:16 |只看该作者

如何提高查找速度

对,写错了。只不过是想用求余运算。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
57 [报告]
发表于 2005-09-19 13:37 |只看该作者

如何提高查找速度

原帖由 "yzc2002" 发表:
不能修改最后一个的值,这个串一般是个const的
(1)串长可能为0
(2)如果是个字符串常量,这个修改可能会造成core dump
(3)如果这个串是静态的,则是线程不安全的,存在溢出的风险


如果是const修饰的串不适合采取修改的办法.

至于长度是0.应该在程序中判断. 总不至于出现你说的问题.

论坛徽章:
0
58 [报告]
发表于 2005-09-19 16:42 |只看该作者

如何提高查找速度

[quote]原帖由 "win_hate"][/quote 发表:


那段代码是用 gcc 3.3.1 生成的,这无用置疑! 我也不会做什么手脚!

至于,它什么只会比较 a[0] != 0 而不比较 a[1] != 0
我只能推测这是它一个比较智能的方面。可能是:代码分别将 a[0] 与 a[1]
置为0,故比较 a[0]。当然这只是推测。或许,这是个 BUG 也有这个可能性。

论坛徽章:
0
59 [报告]
发表于 2009-04-10 16:36 |只看该作者
  1. #include <stdio.h>

  2. int empty_array(char *array, int size)
  3. {
  4.         unsigned long *p = (unsigned long*)array;
  5.         int n = sizeof(unsigned long) / sizeof(char);
  6.         unsigned long mask = 1UL;

  7.         for (; (char*)p < array + size - n; p++)
  8.         {
  9.                 if (*p && mask)
  10.                 {
  11.                         return 0;
  12.                 }
  13.         }

  14.         char *tmp;
  15.         for (tmp = array + size - n; tmp < array + size; ++tmp)
  16.         {
  17.                 if (*tmp)
  18.                         return 0;
  19.         }

  20.         return 1;
  21. }

  22. int main()
  23. {
  24.         char buffer[1024] = {0};

  25.         printf("empty = %d\n", empty_array(buffer, 1024));

  26.         buffer[1] = 1;
  27.         printf("empty = %d\n", empty_array(buffer, 1024));

  28.         return 0;
  29. }
复制代码

论坛徽章:
0
60 [报告]
发表于 2009-04-10 16:45 |只看该作者
今天才看到,雨兄的思路确实挺好.

我最后贴出来的那个代码嘛,大家就看看就得了...

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP