免费注册 查看新帖 |

Chinaunix

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

一个算法题目 [复制链接]

论坛徽章:
1
午马
日期:2013-08-23 23:39:47
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-03-20 22:22 |只看该作者 |倒序浏览
输入 a1, a2, ... , an, b1, b2, ... , bn, 如何在O(n)的时间,用O(1)的空间,将这个序列顺序改为 a1, b1, ...., an, bn.

据说是google的笔试题目,大家看看

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
2 [报告]
发表于 2010-03-20 23:05 |只看该作者
本帖最后由 cjaizss 于 2010-03-20 23:26 编辑

我的猜想错了

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
3 [报告]
发表于 2010-03-20 23:45 |只看该作者
虽然任何两个排列都可以经过小于n次对换得到,
但此题限制O(1)空间复杂度,于是没有标志可以记录是否经历过对换.
有答案吗?

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
4 [报告]
发表于 2010-03-20 23:49 |只看该作者
以下是生成循环的shell程序

  1. #!/bin/bash
  2. echo $1|awk '{x=$1;n=0;}
  3. {
  4.         for(i=1;i<=x*2;i+=1)
  5.                 b[i]=1;
  6.         for(i=1;i<=2*x;i++)
  7.                 if(b[i] == 0)
  8.                         continue;
  9.                 else {
  10.                         b[i]=0;
  11.                         y=i;
  12.                         s=i;
  13.                         j=i;
  14.                         while(1) {
  15.                                 if(j>x)
  16.                                         j=2*(j-x);
  17.                                 else
  18.                                         j=j*2-1;
  19.                                 if(j==y)
  20.                                         break;
  21.                                 s=s","j;
  22.                                 b[j]=0;
  23.                         }
  24.                         S[n++]="("s")";
  25.                 }
  26.         for(i=0;i<n;i++)
  27.                 print S[i];
  28. }'
复制代码
比如当n=256时,
该置换是以下循环的乘积,很复杂

  1. (1)
  2. (2,3,5,9,17,33,65,129,257)
  3. (4,7,13,25,49,97,193,385,258)
  4. (6,11,21,41,81,161,321,130,259)
  5. (8,15,29,57,113,225,449,386,260)
  6. (10,19,37,73,145,289,66,131,261)
  7. (12,23,45,89,177,353,194,387,262)
  8. (14,27,53,105,209,417,322,132,263)
  9. (16,31,61,121,241,481,450,388,264)
  10. (18,35,69,137,273,34,67,133,265)
  11. (20,39,77,153,305,98,195,389,266)
  12. (22,43,85,169,337,162,323,134,267)
  13. (24,47,93,185,369,226,451,390,268)
  14. (26,51,101,201,401,290,68,135,269)
  15. (28,55,109,217,433,354,196,391,270)
  16. (30,59,117,233,465,418,324,136,271)
  17. (32,63,125,249,497,482,452,392,272)
  18. (36,71,141,281,50,99,197,393,274)
  19. (38,75,149,297,82,163,325,138,275)
  20. (40,79,157,313,114,227,453,394,276)
  21. (42,83,165,329,146,291,70,139,277)
  22. (44,87,173,345,178,355,198,395,278)
  23. (46,91,181,361,210,419,326,140,279)
  24. (48,95,189,377,242,483,454,396,280)
  25. (52,103,205,409,306,100,199,397,282)
  26. (54,107,213,425,338,164,327,142,283)
  27. (56,111,221,441,370,228,455,398,284)
  28. (58,115,229,457,402,292,72,143,285)
  29. (60,119,237,473,434,356,200,399,286)
  30. (62,123,245,489,466,420,328,144,287)
  31. (64,127,253,505,498,484,456,400,288)
  32. (74,147,293)
  33. (76,151,301,90,179,357,202,403,294)
  34. (78,155,309,106,211,421,330,148,295)
  35. (80,159,317,122,243,485,458,404,296)
  36. (84,167,333,154,307,102,203,405,298)
  37. (86,171,341,170,339,166,331,150,299)
  38. (88,175,349,186,371,230,459,406,300)
  39. (92,183,365,218,435,358,204,407,302)
  40. (94,187,373,234,467,422,332,152,303)
  41. (96,191,381,250,499,486,460,408,304)
  42. (104,207,413,314,116,231,461,410,308)
  43. (108,215,429,346,180,359,206,411,310)
  44. (110,219,437,362,212,423,334,156,311)
  45. (112,223,445,378,244,487,462,412,312)
  46. (118,235,469,426,340,168,335,158,315)
  47. (120,239,477,442,372,232,463,414,316)
  48. (124,247,493,474,436,360,208,415,318)
  49. (126,251,501,490,468,424,336,160,319)
  50. (128,255,509,506,500,488,464,416,320)
  51. (172,343,174,347,182,363,214,427,342)
  52. (176,351,190,379,246,491,470,428,344)
  53. (184,367,222,443,374,236,471,430,348)
  54. (188,375,238,475,438,364,216,431,350)
  55. (192,383,254,507,502,492,472,432,352)
  56. (220,439,366)
  57. (224,447,382,252,503,494,476,440,368)
  58. (240,479,446,380,248,495,478,444,376)
  59. (256,511,510,508,504,496,480,448,384)
  60. (512)
复制代码

论坛徽章:
1
午马
日期:2013-08-23 23:39:47
5 [报告]
发表于 2010-03-20 23:49 |只看该作者
回复 3# cjaizss


    据说有答案,这题目貌似需要很多技巧

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
6 [报告]
发表于 2010-03-21 00:57 |只看该作者
那么,只能想个办法吧这个置换用几个相交的循环乘积表示

论坛徽章:
0
7 [报告]
发表于 2010-03-21 01:03 |只看该作者
google "完美洗牌 算法"

论坛徽章:
0
8 [报告]
发表于 2010-03-21 03:50 |只看该作者
本帖最后由 xyfree 于 2010-03-21 04:20 编辑

弱弱地说一句....
只要n是已知的,不是用异或就可以搞定的么?

设这个数组或者链表为s, s[1] 即 a[1],s[2]即a[2]。。。s[n+1]即b[1]。。。s[2n] 即b[n]

从a[1]开始,依次与a[i+1]进行异或,直到 i==n-1,存储运算结果为A
从b[1]开始,直到b[n]做同样的事情,运算结果为B

然后开始循环直接改写数组或链表元素的值,

循环内部

  1. t = s[2n];
  2. s[2n] = B ^ s[2n];
  3. B^=t;
  4. t = s[2n-1];
  5. s[2n-1] = A ^ s[2n-1]
  6. A^=t;
复制代码
只需要3个额外空间:t, A, B。
就足够完成全部交换,这样算是O(1)空间吧?
时间貌似是 O(2n),还好....


但愿是我理解错题目了....

论坛徽章:
0
9 [报告]
发表于 2010-03-21 09:08 |只看该作者
a1, a2, ... , an, b1, b2, ... , bn,
a2 与 b1 互换

形成
a1 b1 a3 ... an  ; a2,b2,.b3,....bn
把前面的仍然看作 a, 后面的看作 b;
执行  a3  与 b1互换

得到
a1 b2 a2,a4,....an; a3,b2,......bn;


下一次,从 a4开始, 继续进行。
不知道下标 i 是不是存储? 如果不是的话,好像可以不用额外存粗空间。好像很简单很自然的做法,是我没看明白题意?

论坛徽章:
1
午马
日期:2013-08-23 23:39:47
10 [报告]
发表于 2010-03-21 10:20 |只看该作者
弱弱地说一句....
只要n是已知的,不是用异或就可以搞定的么?

设这个数组或者链表为s, s[1] 即 a[1], ...
xyfree 发表于 2010-03-21 03:50



    空间需要O(1)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP