免费注册 查看新帖 |

Chinaunix

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

一个关于单向链表的面试题。 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2007-02-05 16:09 |只看该作者
原帖由 cjaizss 于 2007-2-5 00:07 发表

O(1)空间复杂度是不存在的,信息量不够。


刚开始我也这样想的,但是想到两个额外指针可以判断链表是否有循环,这里至少有些类似。
呵呵,当然是否存在这样的算法可能只有面试官知道了。

论坛徽章:
0
32 [报告]
发表于 2007-02-05 16:11 |只看该作者
要不让那哥们找一下那个出题的哥们
然后给个答案,然后学习学习吧

论坛徽章:
0
33 [报告]
发表于 2007-02-05 16:14 |只看该作者
hash本身的时间空间复杂度也要考虑吧。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
34 [报告]
发表于 2007-02-05 16:17 |只看该作者
哦,存在空间复杂度O(1),时间复杂度O(n^2)的算法,利用原链表的存储空间。是种很朴素的算法,对于不可预知链表长度而言并不低效。
可预知长度的话,选择O(1)空间还要选择O(n)时间是不可行的。

论坛徽章:
0
35 [报告]
发表于 2007-02-05 17:03 |只看该作者
写了段python代码
验证了刚才的算法
没有复制任何数据
只是指针指来指去


  1. #!/usr/bin/env python

  2. nd7 = [1, None, 'nd7']
  3. nd6 = [1, nd7, 'nd6']
  4. nd5 = [1, nd6, 'nd5']
  5. nd4 = [1, nd5, 'nd4']
  6. nd3 = [1, nd4, 'nd3']
  7. nd2 = [1, nd3, 'nd2']
  8. head = nd1 = [1, nd2, 'nd1']
  9. nd7[1] = nd3        #recycle

  10. def get_next(node):
  11.         if node != None:
  12.                 return node[1]
  13.         else:
  14.                 return None

  15. def has_cycle(head):
  16.         p1 = head
  17.         p2 = head
  18.         while (p1 != None) and (p2 != None):
  19.                 p1 = get_next(p1)
  20.                 p2 = get_next(p2)
  21.                 p2 = get_next(p2)
  22.                 if p1 == None or p2 == None:
  23.                         return [0, None]
  24.                 if id(p1) == id(p2):
  25.                         return [1, p1]
  26.         return [0, None]

  27. def node_in_cycle(node, cycle_nd):
  28.         bak = cycle_nd
  29.         while True:
  30.                 if id(node) == id(cycle_nd):
  31.                         return True
  32.                 cycle_nd = get_next(cycle_nd)
  33.                 if id(bak) == id(cycle_nd):
  34.                         return False

  35. def look_for_cycle_point(head, cycle_nd):
  36.         while head != None:
  37.                 if node_in_cycle(head, cycle_nd):
  38.                         return head
  39.                 else:
  40.                         head = get_next(head)
  41.         return None

  42. if __name__ == '__main__':
  43.         print 'Go...'
  44.         ret = has_cycle(head)
  45.         if ret[0]:
  46.                 node = look_for_cycle_point(head,ret[1])
  47.                 print node[2]
  48.         else:
  49.                 print 'No cycle'
复制代码

论坛徽章:
0
36 [报告]
发表于 2007-02-05 17:10 |只看该作者

  1. 时间复杂度O(n),空间复杂度O(n/8) ,引用计数大于1即是交结点。不知我这么说,多少人可以明白
复制代码

[ 本帖最后由 skipjack 于 2007-2-5 17:12 编辑 ]

论坛徽章:
0
37 [报告]
发表于 2007-02-05 17:41 |只看该作者
无知无谓啊~
原帖由 cjaizss 于 2007-2-5 15:04 发表
平均
空间复杂度O(n),时间复杂度O(n^2),这是不可超越的。
只可以在这一级别上提高。

论坛徽章:
0
38 [报告]
发表于 2007-02-05 17:44 |只看该作者
做个标记,晚上听完音乐会回来解答,
基本上是把数组看成一颗树,对其进行深度遍历,刚开始每个节点mark为白色,遍历一次mark为灰色,回退过的几点编程白色。经历两次即为我们要找的节点。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
39 [报告]
发表于 2007-02-05 18:16 |只看该作者
原帖由 softsongs 于 2007-2-5 17:41 发表
无知无谓啊~

...
我的错。
在链表长度不可预知的情况下,也依然存在空间复杂度O(n),时间复杂度O(nlogn)的算法。
构造sort-tree存储信息。
时间复杂度算错了

论坛徽章:
0
40 [报告]
发表于 2007-02-05 19:31 |只看该作者

回复 39楼 cjaizss 的帖子

觉得这题,就像字符串中查找子串……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP