免费注册 查看新帖 |

Chinaunix

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

[算法] 【算法】找连续比特为1的最大值 [复制链接]

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-10-28 19:41 |只看该作者 |倒序浏览
给出任意一个32bit的数字(即int型数据),求这个数字连续比特为1的最大值。例如:
给出数字3,那么3=0b11,最大值为2.
给出数字0xf03.那么0xf03=0x111100000011.最大值为4。

论坛徽章:
11
巨蟹座
日期:2013-12-23 11:12:14双子座
日期:2014-08-28 09:14:55子鼠
日期:2014-07-25 16:21:22摩羯座
日期:2014-07-23 15:17:47摩羯座
日期:2014-05-30 13:09:05午马
日期:2014-04-30 18:10:00天秤座
日期:2014-04-25 12:12:00申猴
日期:2014-04-22 11:30:15午马
日期:2014-03-07 16:06:40辰龙
日期:2013-12-25 18:36:00摩羯座
日期:2014-09-02 17:00:55
2 [报告]
发表于 2014-10-28 21:29 |只看该作者
来一个
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;

  4. int main(int argc, char *argv[])
  5. {
  6.         string str;
  7.         while (cin >> str) {
  8.                 int sum = 0, b = 0;
  9.                 for (auto i = 0; i < str.size(); i++)
  10.                 {
  11.                         if (str[i] == '1') b++;
  12.                         else b = 0;
  13.                         if (b > sum) sum = b;
  14.                 }
  15.                 cout << sum << endl;
  16.         }
  17.         return 0;
  18. }
复制代码

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
3 [报告]
发表于 2014-10-29 07:30 |只看该作者
回复 2# Susake_


赞一个!但这个方法应该是最容易想到的吧。有没有更高效率的呢
ps
用位操作可能比你这样的字符比较要快一点,很多架构都提供了bne或者beq之类的指令。arm更是提供了addne之类的指令
字符的比较就麻烦一点

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
4 [报告]
发表于 2014-10-29 09:15 |只看该作者
除了遍历每一个bit外,只想到一个办法
先做一个数组 buf_[256]
其中每一项保存索引值的最大连续比特为1的数目
比如 181 的二进制为 10110101,那我们就保存 buf_[181] = { {-,7}, {4,5}, {0,-} }
比如 192 的二进制为 11000000,那我们就保存 buf_[128] = { {-,6}, {x,x}, {x,x} }
也就是'-'代表最左边或最右边,能和别人相接,'x'代表没有,中间的{4,5}表示既不是最左边也不是最右边的连续1最大数目。
假设你在纸上已经做好了0-255的所有计算,得到
static unsigned map_[256][3][2] = { …… };
然后将你这个32bits的数字分解成4个8bits的数字,通过map_拼接起来,比如
{ {-,7}, {4,5}, {0,-} }(右边第1个8bits) 和 { {-,6}, {x,x}, {x,x} }(右边第0个8bits) 拼接起来就是 { {-,15}, {8,6}, {x,x} }
假设最终表达式为 { {-,15}, {8,6}, {1,-} },我们在31-15,8-6,1-0中取最大值,即31-15,即第15位到31位都是1

论坛徽章:
11
巨蟹座
日期:2013-12-23 11:12:14双子座
日期:2014-08-28 09:14:55子鼠
日期:2014-07-25 16:21:22摩羯座
日期:2014-07-23 15:17:47摩羯座
日期:2014-05-30 13:09:05午马
日期:2014-04-30 18:10:00天秤座
日期:2014-04-25 12:12:00申猴
日期:2014-04-22 11:30:15午马
日期:2014-03-07 16:06:40辰龙
日期:2013-12-25 18:36:00摩羯座
日期:2014-09-02 17:00:55
5 [报告]
发表于 2014-10-29 09:36 |只看该作者
本帖最后由 Susake_ 于 2014-10-29 09:43 编辑

从算法思想上看
1.动态规划优化   (应该不行,保底也要O(n) )
2.分治优化 (不行,因为要先排序,再也就是要 求连续的最长)
再从数据结构上看看
貌似理想的查询效率也是log(n),况且查询和插入操作同时为0(1)的数据结构貌似也没-----这里n个字符串就是nlog(n)
---------------------------------------------------------
所以,我的最终想法是
那干脆直接输入一个就处理一个,直接输出结果~~
也许有更好的吧,可能我没想到!!
^_^
还有好像有点看错题了,可以输入8/16进制的...我直接当2进制算了!!

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2014-10-29 10:48 |只看该作者
[ 本帖最后由 safedead 于 2014-10-29 11:12 编辑 ]

假设64位无符号整数存储于寄存器RSI中,求此整数最大连续1的数值

C风格伪代码如下:

RAX = 0x0;
if (RSI == 0) return;
RDX = 0x1;
RAX = 0x1;
for (RCX = 0; RCX < 63; RCX++) {
    if (RSI & 0x1) {
        RDX++;
        if (RDX > RAX) RAX++;
    } else {
        RDX = 0x1;
    }
    RSI = (RSI >> 1);
}
return;

论坛徽章:
0
7 [报告]
发表于 2014-10-29 12:22 |只看该作者
我也贴一个,不知道对不对

  1. inline int bit_count(unsigned int n)
  2. {
  3.     int ret = 0;
  4.     for(int i = 0; n; n = n>>1)
  5.     {
  6.         if(n & 1U)
  7.         {
  8.             ++i;
  9.             if(i>ret)
  10.             {
  11.                 ret = i;
  12.             }
  13.         }
  14.         else
  15.         {
  16.             i = 0;
  17.         }
  18.     }

  19.     return ret;
  20. }

  21. inline int bit_count2(unsigned int n)
  22. {
  23.     int ret = 0;
  24.     int count = 0;
  25.     for(unsigned int i = 0U; n; )
  26.     {
  27.         unsigned int t = n & (n-1);
  28.         unsigned int m = n - t;
  29.         if(i == 0U || m == i << 1)
  30.         {
  31.             count++;
  32.         }
  33.         else
  34.         {
  35.             count = 1;
  36.         }

  37.         if(count > ret )
  38.         {
  39.             ret = count;
  40.         }
  41.         i = m;
  42.         n = t;
  43.     }

  44.     return ret;
  45. }
复制代码

论坛徽章:
2
酉鸡
日期:2013-09-26 11:11:15摩羯座
日期:2014-01-08 13:45:19
8 [报告]
发表于 2014-10-29 12:40 |只看该作者
《高效程序的奥秘》 2nd ed
int maxstr1(unsigned x) {
    int k;
    for (k = 0; x ! = 0; k++) x = x & 2*x;
    return k;
}

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
9 [报告]
发表于 2014-10-29 12:53 |只看该作者
回复 8# hejianet
牛,思路简洁 导致 代码简洁

论坛徽章:
0
10 [报告]
发表于 2014-10-29 13:15 |只看该作者
回复 8# hejianet


    赞思路!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP