每天一个算法

二分法分析

目的:在一个有序的列表nums,判断x是否在这个列表里

一、问题分析(研究需要解决的问题)

1.怎么样最快的判断出x是否在列表里

二、程序规格说明说:确定程序做什么

1.利用中间值比较x,逐步比较,缩小空间

2.x代表要判断的值,nuns代表列表

3.low象限代表最低值,high象限代表最高值

三、设计:用伪代码编写算法(写成方法)

1、创建search方法,可输入x,nums

2、创建区域最低值low=0,创建区域高值high

3、创建条件循环,当low小于high时,进入循环

4、利用low+high//2获取中间值

5、判断x与中间值(nums[mid])是否相等,相等则返回min,中间值大于x,low则取min+1,中间值小于x,high则取中间值,再进入循环判断

6、如果low取到最大值且等于x时返回x(可能x取的值就是最大的值,循环不会判断到)

7、如果都没有,则返回-1表示列表里没有x

四、将设计语言翻译成编译语言

1.def search(x,nums):

2.low=0,high=len(nums)-1

3.while low<high:

4.mid=(low+high)//2 

5.if x ==nums(mid):   return mid;     elif x>mid: low=low+1;    else: high=mid

6.if nums(low)==x: return low

7.return -1

(递归思想)反转字符串:

目的:反转输入的字符串

一、问题分析

1.利用切片的方法分割字符串

2.利用递归不断切字符串

3.注意死循环

二、规格说明说

s:字符串

reverse:方法名称

三、设计伪代码

1.创建方法

2.判断字符串是否为空,如为空返回字符串

3.递归切字符串并返回

四、编程语言翻译代码 

def reverse(s):

  if s=="":

    return s

  else:

    return reverse(s[1:])+s[0]

(递归思想)二分法:

目的:利用递归思想简化二分法算法

规格说明说:

1.二分法算法 :利用中间值与查找数比较,并逐渐缩小范围,判断数是否存在

2.递归:找出中间值mid对比x,相等返回mid, 如果小于以中间值为点向下切片min_nums=nums[0:mid],大于max_nums=nums[mid+1:high]

3.当low+high//2==0和nums[low+high]==x时,返回1,否则返回-1

伪代码:

创建函数search,可输入值x,nums

得到最低数值low,得到最高数值high,算出中间数值mid,

找出中间值mid对比x,相等返回mid, 如果小于以中间值为点向下切片min_nums=nums[0:mid],大于max_nums=nums[mid:high]

"""利用递归思想,简化二分法"""
def Seach(x,nums):
low=0
high=len(nums)-1
mid = (low + high) // 2
if mid ==0:
return -1
item=nums[mid]
if x==item:
return 1
elif x<item:
num=nums[0:mid]
return Seach(x,num)
elif x>item:
num=nums[mid+1:high]
return Seach(x,num)

证明这个想法时错误的

正确的如下:

def recBinSearch(x, nums, low, high):

if low > high: return -1

mid = (low + high) // 2 item = nums[mid]
if item == x:

return mid elif x < item:

# No place left to look, return -1

# Found it! Return the index

# Look in lower half return recBinSearch(x, nums, low, mid-1)

else: # Look in upper half return recBinSearch(x, nums, mid+1, high)

 

原文地址:https://www.cnblogs.com/zhifeiji822/p/11866609.html