美文网首页
数据结构基础与算法

数据结构基础与算法

作者: 噗嗤噗哩噗通 | 来源:发表于2021-04-08 18:07 被阅读0次

前言:
刷leetcode的时候发现,基础的算法不清楚的话,就很难实现工程。
还是打基础。


1. 数据结构:

栈 Stack
队列 Queue
链表 Linked List
数组 Array
哈希表 Hash Table
二叉树 Binary Tree
堆 Heap
并查集 Union Find
字典树 Trie

2. 算法:

2.1 算法列表

二分搜索 Binary Search
分治 Divide Conquer
宽度优先搜索 Breadth First Search
深度优先搜索 Depth First Search
回溯法 Backtracking
双指针 Two Pointers
动态规划 Dynamic Programming
扫描线 Scan-line algorithm
快排 Quick Sort

2.2 整理基础算法逻辑:

二分查找:有序数据,一步步从一半的位置判断:

def binary_search(list,item):
    low=0
    high=len(list)-1
    ### 开始二分查找:
    while low<=high:
        mid=int((low+high)/2)
        guess=list[mid]
        if guess==item:
            return mid
        elif guess>item:
            high=mid-1
        elif guess<itime:
            low=mid+1
        else :
            print('next')
    return None

时间复杂度计算:
[图片上传中...(image.png-93f478-1617875460466-0)]

image.png

递归:递归只是让解决方案更清晰,并没有性能上的优势

def quicksort(Array):
    if len(Array)<2:
        return Array
    else:
        pivot=Array[0]
        print pivot
        ### 这里的小于等于主要是因为如果出现重复数值,要全部包含进来。
        less=[i for i in Array[1:] if i<=pivot]
        greater=[i for i in Array[1:] if i>pivot]
        return quicksort(less)+[pivot]+quicksort(greater)

广度搜索

def search(name):
    flag = 0
    search_queue = deque() #创建一个队列
    search_queue += graph["A"] # 将起点的一度关系结点加入队列
    searched = [] # 记录检查过的人
    string = "A" # 记录路径
    while search_queue:
        node = search_queue.popleft() # 取出队首第一个元素
        if node not in searched: # 只在没有检查的时候看
            if node == name:
                string += "-->" + node
                flag = 1
                print(string)
                return True
            else:
                string += "-->" + node
                search_queue += graph[node] # 不是G,将该节点的一度关系结点加
入队列末尾
               searched.append(node)
    
    if flag == 1:
        print(string)
    else :
        print(name,"not in graph")


from collections import deque

graph = {}
graph["A"] = ["B","C","D"]
graph["B"] = ["F"]
graph["C"] = ["G"]
graph["D"] = ["E"]
graph["E"] = []
graph["F"] = ["G"]
graph["G"] = []

search("G")

增加了class的代码,还是有点有趣的:

from collections import deque    # 线性表的模块
 
# 首先定义一个创建图的类,使用邻接矩阵
class Graph(object):
    def __init__(self, *args, **kwargs):
        self.order = []  # visited order
        self.neighbor = {}
 
    def add_node(self, node):
        key, val = node
        if not isinstance(val, list):
            print('节点输入时应该为一个线性表')    # 避免不正确的输入
        self.neighbor[key] = val
 
    # 宽度优先算法的实现
    def BFS(self, root):
        #首先判断根节点是否为空节点
        if root != None:
            search_queue = deque()
            search_queue.append(root)
            visited = []
        else:
            print('root is None')
            return -1
 
        while search_queue:
            person = search_queue.popleft()
            self.order.append(person)
 
            if (not person in visited) and (person in self.neighbor.keys()):
                search_queue += self.neighbor[person]
                visited.append(person)
 
    # 深度优先算法的实现
    def DFS(self, root):
        # 首先判断根节点是否为空节点
        if root != None:
            search_queue = deque()
            search_queue.append(root)
 
            visited = []
        else:
            print('root is None')
            return -1
 
        while search_queue:
            person = search_queue.popleft()
            self.order.append(person)
 
            if (not person in visited) and (person in self.neighbor.keys()):
                tmp = self.neighbor[person]
                tmp.reverse()
 
                for index in tmp:
                    search_queue.appendleft(index)
 
                visited.append(person)
 
    def clear(self):
        self.order = []
 
    def node_print(self):
        for index in self.order:
            print(index, end='  ')
 
 
if __name__ == '__main__':
    # 创建一个二叉树图
    g = Graph()
    g.add_node(('A', ['B', 'C']))
    g.add_node(('B', ['D', 'E']))
    g.add_node(('C', ['F']))
 
    # 进行宽度优先搜索
    g.BFS('A')
    print('宽度优先搜索:')
    print('  ', end='  ')
    g.node_print()
    g.clear()
 
    # 进行深度优先搜索
    print('\n\n深度优先搜索:')
    print('  ', end='  ')
    g.DFS('A')
    g.node_print()
    print()

动态规划
动态规划功能强大,它能够解决子问题并使用这些答案来解决大问题。但仅当每个子问题都是离散的,即不依赖于其他子问题时,动态规划才管用。这意味着使用动态规划算法解决不了去巴黎玩的问题。

线性规划:

python里面的向量乘除法:

相关文章

  • 如何学习数据结构与算法

    算法学习经验 推荐: 入门: 数据结构启蒙:《数据结构与算法分析——C 语言描述》 算法启蒙:《算法设计与分析基础...

  • 算法与数据结构

    数据结构 数据结构与算法分析_Java语言描述(第2版) 算法 计算机算法基础算法导论编程之法_面试和算法心得 c...

  • #算法与数据结构书籍

    数据结构 数据结构与算法分析_Java语言描述(第2版) 算法 计算机算法基础算法导论编程之法_面试和算法心得 c...

  • 数据结构 & 算法 in Swift (一):Swift

    数据结构 & 算法 in Swift (一):Swift基础和数据结构 数据结构 & 算法 in Swift (一...

  • 数据结构与算法学习开篇

    数据结构与算法知识图谱 20个最常用的、最基础数据结构与算法 10个数据结构:数组、链表、栈、队列、散列表、二叉树...

  • 数据结构与算法 - 查找

    数据结构与算法系列文章数据结构与算法 - 时间复杂度数据结构与算法 - 线性表数据结构与算法 - 树形结构数据结构...

  • 29.算法入门

    算法与数据结构基础 一、基础算法思想二分: 递推: 枚举: 递归: 分治: 贪心: 试探: 模拟: 二、简单数据结...

  • 思维导图之数据结构+算法

    数据结构+算法 = 程序 数据结构比较 参考文章 数据结构与算法数据结构与算法(java)

  • 数据结构与算法 - 树形结构

    数据结构与算法系列文章数据结构与算法 - 时间复杂度数据结构与算法 - 线性表数据结构与算法 - 树形结构 目录 ...

  • 数据结构, 算法, 设计模式资料

    资料 实践, 阅读, 思考并行 资料数据结构, 算法设计模式 数据结构, 算法 计算机科学的基础 零基础学算法 大...

网友评论

      本文标题:数据结构基础与算法

      本文链接:https://www.haomeiwen.com/subject/efsvkltx.html