免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 11397 | 回复: 11
打印 上一主题 下一主题

字符串去重,bitmap操作 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-06-27 18:32 |只看该作者 |倒序浏览
将类似aaabbccdabgf这样的去重为abcdgf
下面是算法设计:

int main()
{
  int i;
  char *source = "aaabbccdabgf";  
  
  char *dest;
  char *temp;

  unsigned int bitmap[8] = {0,0,0,0,0,0,0,0};
  unsigned char c;
  unsigned int mask;

  dest = (char*)malloc(strlen(source));
  temp = dest;

  printf("Before %s\n", source);
  i=0;
  while(source[i])
  {
    c = source[i];
    mask = 1 << (c % 32);
    if ((bitmap[c/32] & mask) == 0)   
    {
      *temp++ = source[i];
      bitmap[c/32] |= mask;
    }
    i++;
  }
  *temp = '\0';
   
  printf("After %s\n", dest);
}

不明白为while循环内部的操作,望大牛们指点!@

论坛徽章:
0
2 [报告]
发表于 2011-06-27 18:37 |只看该作者
先自己顶下,哈哈

论坛徽章:
0
3 [报告]
发表于 2011-06-27 19:05 |只看该作者
while(source[i])  //循环处理每个字符
   {
     c = source[i];  //当前待处理字符
     mask = 1 << (c % 32);  //当前字符对应的到某一bit位
     // 除以32是因为一个int类型有32个bit,注意bitmap是int数组
     if ((bitmap[c/32] & mask) == 0)   //比较,没有出现过?
     {
       *temp++ = source[i];  //转存到temp变量内
       bitmap[c/32] |= mask;  //对应的标记置位
     }
     i++;
   }

代码还有很多细节问题

论坛徽章:
0
4 [报告]
发表于 2011-06-27 19:06 |只看该作者
我说的细节问题是比如malloc没有判空,无关紧要。{:3_185:}

论坛徽章:
0
5 [报告]
发表于 2011-06-28 09:45 |只看该作者
回复 3# lenky0401

多谢楼上进行代码注释,不过还是没理解,mask = 1 << (c % 32); 为什么对32进行取模操作后进行左移1位,也就是x2

论坛徽章:
0
6 [报告]
发表于 2011-06-28 09:58 |只看该作者
回复 5# liqingfang


    左移为了这个 bitmap[c/32] & mask

论坛徽章:
0
7 [报告]
发表于 2011-06-28 10:26 |只看该作者
回复 6# edgar51774


    可不可以详细些?

论坛徽章:
0
8 [报告]
发表于 2011-06-28 16:41 |只看该作者
{:3_205:}

论坛徽章:
0
9 [报告]
发表于 2011-06-28 20:26 |只看该作者
回复  lenky0401

多谢楼上进行代码注释,不过还是没理解,mask = 1 << (c % 32); 为什么对32进行取模操作后进行左移1位,也就是x2liqingfang 发表于 2011-06-28 09:45



    这个你理解有误
    不是左移1位
    是1左移若干位

论坛徽章:
0
10 [报告]
发表于 2011-06-28 20:41 |只看该作者
代码的核心思想是
unsigned int bitmap[8] = {0,0,0,0,0,0,0,0};
一共有 8*sizeof bitmap =256 bits
用这256位记录256个数(unsigned char c的范围)是否出现过
比如65('A') 出现
就把第65位写为1
bitmap的第65位显然应该记录在bitmap[2]中(bitmap[0],bitmap[1]记录了64位)
其他就没什么好说的了吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP