算法图解学习笔记-二分法、链表、数组

1、二分法查找

def binary_search(list,item):
    low=0 #设置查找范围的最小数的索引值
    high=len(list)-1#设置查找范围的最大数的索引值
    while low<=high: #当查找范围的最大数的索引值大于等于查找范围的最小数的索引值
        mid=(low+high)//2#查找范围中间值的索引值
        guess=list[mid]
        if guess==item:#如果猜中了,返回该元素索引值
            return mid
        elif guess>item:high=mid-1#如果猜大了,调整查找范围最大数的索引值为中间值-1
        else:low=mid+1#如果猜小了,调整查找范围最小数的索引值为中间值+1
    return None #查找范围内无该元素,返回空值
if __name__=='__main__':
    my_list=[1,3,5,7,9,11,13,15,17]
    print(binary_search(my_list,15))

 旅行商问题:

一个旅行商要去五个城市,那么他有5!种选择,,如果要挑出最短的路线,则要执行120次操作。这种算法的运行时间为O(n!)

  1. 二分查找的速度比简单查找快得多
  2. O(logn)比O(n)快。需要搜索的元素越多,前者比后者就快得越多
  3. 算法运行时间并不以秒为单位
  4. 算法运行时间是从其增长速度的角度度量的
  5. 算法运行时间用大O表示法表示

2、数组和链表

1.内存工作原理

内存就是柜子,柜子里有很多抽屉

当你需要将数据存储到内存是,你请求计算机提供存储空间,计算机给你一个存储地址。

当你需要存储多项数据是,有两种基本方式-数组和链表

2.数组和链表

数组

假如你编写一个管理待办事项的应用程序,为此需要将这些待办事项存储在内存中;

使用数组意味着所有待办事项在内存中都是相连的。

举个例子:

我们把待办事件看作是“文件”,把内存看做是“抽屉”,每一个“抽屉”放一个“文件”

加入你要把四个待办事件放在“抽屉”里,当你放进去三个的时候,你发现第四个“抽屉”放着别人的东西。

这个时候,你只能让计算机再给你一个能容纳四个文件的“抽屉”,再把文件一一放进四个抽屉。

再举个例子:

你和你的朋友去看电影,买了三人座之后,突然又来了个朋友,但原来的位置没有空位了。这时候你们只能再找一个可以坐下所有人的位置。

这样一旦有新朋友过来,就得再换位置,那么该怎么解决呢?

一种方法就是预留座位,三个人看电影,找个十连排的座,这样即使再有7个朋友来,也不必换座位。

可是这种做法有两个缺点:

第一、多出来的座位可能根本用不上,这是对资源的浪费

第二、当来第八个朋友的时候,你还得转移

对于这种问题,可以用链表来解决

链表

链表中的元素可以存储在内存的任何地方

链表的每个元素都存储了下一个元素的地址,从而使一系列随机的内存地址串在一起。

这就像寻宝游戏,当你前往第一个地址的时候,你会获得第二个地址的坐标,然后依次找下去。

因此,在链表中添加元素很容易,值需要将其放入内存,并将其地址存储到前一个元素中。

这样就完美解决看电影的问题,链表就相当于说“我们分开来坐,但是可以通过一个人的座位,找到下一个人的座位”

只要有足够的内存空间,就能为链表分配内存。

链表的优势就体现在插入元素方面。

 

 

你可能感兴趣的:(学习笔记,算法)