鱼C论坛

 找回密码
 立即注册
查看: 1883|回复: 7

二分搜索和归并排序,list index out of range

[复制链接]
发表于 2021-10-19 06:34:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 小城的悠闲 于 2021-10-19 17:11 编辑

寻找一个随机列表中是否存在相反的数  a= -a
我写了一段代码,先用merge_sort 排序,然后用二分法寻找 -a是否存在。
运行的时候,总是反馈 list index out of range。
但是,单独运行二分搜索的时候,则没有list index out of range。到底怎么了。。。


  1. import random as ra

  2. # 寻找相反数
  3. def sum_t(l):
  4.     sum_two = False
  5.     l = merge_sort(l)
  6.     for dd in l:
  7.         if bins(l,-dd):
  8.            sum_two= True
  9.            t = dd
  10.     return sum_two, t
  11. #产生随机数列
  12. def ralist(n):
  13.     a = []
  14.     for i in range(n):
  15.         b = ra.randint(-100, 100)
  16.         if b not in a:
  17.             a.append(b)
  18.     return a
  19. #归并法排序
  20. def merge_sort(a):
  21.     last = len(a)
  22.     if last == 1:
  23.         return a
  24.     else:
  25.         m = last//2
  26.         left = a[:m]
  27.         right = a[m:]
  28.         return mergei(merge_sort(left),merge_sort(right))
  29.    
  30. def mergei(left, right):
  31.     result = []
  32.     while len(left)>0 and len(right)>0:
  33.         if left[0] <= right[0]:
  34.             result.append(left.pop(0))
  35.         else:
  36.             result.append(right.pop(0))
  37.     result = result + left
  38.     result = result + right
  39.     return result        

  40. #递归法二分搜索
  41. def bins(A,n):
  42.     last = len(A)
  43.    
  44.     found = False
  45.     m = last//2
  46.    
  47.     if n == A[m]:
  48.         found = True
  49.     elif m >0 and not found:
  50.         if n > A[m]:
  51.             return bins(A[m+1:], n)
  52.         else:
  53.             return bins(A[:m],n)
  54.     return found

  55. #运行
  56. k = ralist(40)
  57. sum_t(k)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-19 08:23:33 | 显示全部楼层
温馨提示:你的代码没有注解,看起来比较费力,最好加些注解,方便别人检查你的代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-19 10:36:27 | 显示全部楼层
bins函数没有考虑到A等于[]的情况,所以报错了。
如果只是练习二分法,没有必要用递归,二分法用循环就行。以下是力扣上的案例:
  1.     def search(self, nums: List[int], target: int) -> int:
  2.         low, high = 0, len(nums) - 1
  3.         while low <= high:
  4.             mid = (high - low) // 2 + low
  5.             num = nums[mid]
  6.             if num == target:
  7.                 return mid
  8.             elif num > target:
  9.                 high = mid - 1
  10.             else:
  11.                 low = mid + 1
  12.         return 0
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-19 14:41:22 | 显示全部楼层
本帖最后由 jackz007 于 2021-10-19 15:18 编辑
  1. #coding:gbk

  2. '''本程序产生出 40 个值在 -100~100 之间的随机数,然后,利用二分法找出其中 x , -x 同时存在的数据对'''

  3. import random

  4. def gen(d , n):
  5.     k = 0
  6.     while k < n :
  7.         x = random . randint(-100 , 100)
  8.         if not x in d:
  9.             d . append(x)
  10.             k += 1

  11. def find(d , x):
  12.     a , c , r = 0 , len(d) - 1 , -1
  13.     while d[a] <= x <= d[c]:
  14.         b = a + (c - a) // 2
  15.         if d[b] == x:
  16.             r = b
  17.             break
  18.         else:
  19.             if d[b] > x:
  20.                 c = b
  21.             else:
  22.                 a = b + 1
  23.     return r

  24. e , d = [] , []
  25. gen(d , 40)
  26. d . sort()
  27. for i in range(len(d)):
  28.     x = d[i]
  29.     if x and not x in e and not -x in e:
  30.         k = find(d , -x)
  31.         if k >= 0:
  32.             e . append(x)
  33.             print('found %d and %d' % (x , -x))
  34. print(*d)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-19 17:11:47 | 显示全部楼层
傻眼貓咪 发表于 2021-10-19 08:23
温馨提示:你的代码没有注解,看起来比较费力,最好加些注解,方便别人检查你的代码

添加了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-19 17:13:01 | 显示全部楼层
suchocolate 发表于 2021-10-19 10:36
bins函数没有考虑到A等于[]的情况,所以报错了。
如果只是练习二分法,没有必要用递归,二分法用循环就行 ...

还是需要递归二分搜索的。。。问题是,单独运行二分搜索时不报错。执行寻找sum_t函数时报错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-19 17:15:05 | 显示全部楼层

不可以用sort。不可以用逐个比较。因为逐个比较的时间复杂度时n2
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-19 18:33:33 | 显示全部楼层
suchocolate 发表于 2021-10-19 10:36
bins函数没有考虑到A等于[]的情况,所以报错了。
如果只是练习二分法,没有必要用递归,二分法用循环就行 ...

感谢提醒,我加了个边界,基本解决了
def bins(A,n):
    last = len(A)
           
    found = False
    if last == 0:
        return False
   
    m = last//2
   
    if n == A[m]:
        found = True
    elif m >0 and not found:
        if n > A[m]:
            return bins(A[m+1:], n)
        else:
            return bins(A[:m],n)
    return found
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-21 17:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表