伪笔记之算法与数据结构【内向 即废物--王奕君】

本文均是对<算法图解>一书进行的学习笔记。

#排序算法--选择排序
def findsmall(arr):
    smallest=arr[0]
    samllest_index=0
    for i in range(1,len(arr)):
        if arr[i]<smallest:
            smallest=arr[i]
            samllest_index=i
    return samllest_index
def select_sort(arr):
    new=[]
    for i in range(len(arr)):
        smallest=findsmall(arr)
        new.append(arr.pop(smallest))
    return new
print(select_sort([5,32,100,56,10]))

#目的:将数组元素从小到大排序
#思路:编写一个用于找出数组中最小的元素的索引函数。
#     然后利用list.append(list.pop(index))进行排序

Res:[5, 10, 32, 56, 100]

 

#递归算法:
def recursion(i):
    if i<0:
        return 'd''o''g'
    else:
        return recursion(i-1)
res=recursion(i=5)
print(res)

Res:

dog
#概念:函数调用自己的算法称为递归算法

#要点1:递归函数有两个条件--基线条件和递归条件,基线表示结束条件,递归表示函数调用自己的条件
#要点2:迭代算法中如何返回数据的原理

返回None的原因:

首先执行fun(0),然后依次是fun(1),fun(2),fun(3),fun(4),在fun(3)中,i 满足i < 5,进入fun(4),在if语句暂停,fun(4)返回值为5,返回fun(3)中,fun(3)接着执行,但没有执行到return语句,所以fun(3)返回值为None,同理:fun(2),fun(1),fun(0)也都没有执行到return语句,所以最终返回值为 None 。

 

#迭代算法:即for循环

#函数调用栈:
def a(a_1):
    print(a_1)
    a_1=b(a_1)
    return c(a_1)
def b(a_1):
    a_1+='a'
    print(a_1)
    return a_1
def c(a_1):
    a_1+='t'
    print(a_1)
    return a_1
a('c')

Res:

c

ca

Cat

要点:

程序使用一个栈来表示这些内存块

如果这个栈用于存储多个函数的变量,则被称为调用栈

函数调用栈的过程:

  1. 程序首先为a(a_1)函数分配一块内存
  2. 内存中变量name设为a_1,函数是a(a_1)
  3. 程序调用b(a_1)
  4. 程序为b(a_1)分配一块内存块,同时b(a_1)叠加在a(a_1)上
  5. 然后b(a_1)返回调用的数据,此时栈顶的b(a_1)内存块被弹出
  6. 此时栈顶的内存块是a(a_1)
  7. 接着程序调用c(a_1)
  8. 程序为c(a_1)分配一块内存块,同时c(a_1)叠加在a(a_1)上
  9. 然后c(a_1)返回调用的数据,此时栈顶的c(a_1)内存块被弹出
  10. 最后返回到函数a(a_1)

#广度优先算法:

关系图:

 

关系图由node和edge组成。

 

有向图:有指向它的方向尖头,但是没有从该节点出发的尖头。

无向图:有指向它的方向尖头,同时也有从该节点出发的尖头。

 

广度优先算法涉及的数据结构queue:

 

 


#目的:查找出关系图中是谁是傻逼:

#算法如下:

from collections import deque
def judge_boss(name):
    if '倪' in name:
        return name
    else:
        return False
def search():
    global q_q
    while q_q:
        person=q_q.popleft()
        print(person)
        if judge_boss(person):
            return '傻逼是'+person
        else:
            q_q+=circle[person]
    return False
q_q=deque()
circle={}
circle['you']=['王','奕','君']
circle['王']=['沈','吟','秋']
circle['奕']=['屠']
circle['君']=['蔡']
circle['沈']=[]
circle['吟']=[]
circle['秋']=['倪文杰']
circle['倪文杰']=['琪']
circle['顾']=[]
circle['屠']=['卿']
circle['蔡']=[]
circle['卿']=[]
q_q+=circle['you']
print(search())

Res:

傻逼是倪文杰

【注意】广度优先算法中如果a的朋友是b c的朋友也是b就会出现两次去判断两次b,为了避免如此可以

加一个列表然后把所有判断以后不是的放入列表中,每次做一个判断,如果新取出的元素在列表中则跳过,否则的话执行下去。

 

树:

 

 

猜你喜欢

转载自blog.csdn.net/qq_37995231/article/details/81805324
今日推荐