![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
日常分享自己学习数据结构与算法的笔记
HDD615
努力搬砖的技术人
展开
-
深度优先搜索(DFS)-- Python
DFS(深度优先搜索):是一种对图进行搜索的算法。借助栈:先进后出的性质实现深度优先搜索会沿着一条路径不断往下搜索直到不能再继续为止,然后再折返,开始搜索下一条候补路径。定义一个图:graph = { "A":["B","C"], "B":["A","C","D"], "C":["A","B","D","E"], "D":["B","C","E","F"], "E":["C","D"], "F":["D"]}下面的代码:graph = {原创 2021-11-29 16:41:56 · 2303 阅读 · 0 评论 -
广度优先搜索(BFS) -- Python
BFS(广度优先搜索):是一种对图进行搜索的算法。借助队列:先进先出的性质实现假设我们一开始位于某个顶点(即起点),此时并不知道图的整体结构,而我们的目的是从起点开始顺着边搜索,直到到达指定顶点(即终点)。在此过程中每走到一个顶点,就会判断一次它是否为终点。广度优先搜索会优先从离起点近的顶点开始搜索。# 定义上面的图graph = { "A":["B","C"], "B":["A","C","D"], "C":["A","B","D","E"], "D":["B"原创 2021-11-29 16:31:30 · 1166 阅读 · 0 评论 -
字符串匹配算法(Python)
BF(暴力搜索算法)将两个串 A 和串 B,依次循环实现两个串的模式匹配过程def BF(s,p): # 判断串p在不在串s中 n1 = len(s) n2 = len(p) i,j = 0,0 while i < n1 and j < n2: if s[i] == p[j]: i += 1 j += 1 else: i = i - j + 1 j = 0 if j == n2: return i - j else: return -1原创 2021-11-24 13:48:13 · 2973 阅读 · 0 评论 -
八皇后(回溯算法) -- Python
n = 4place = [0 for i in range(n)] # 表示第几行放在第几列,例如place[0] = 1, place[1] = 3flag = [0 for i in range(n)] # 表示第n列被标记,比如第一列被标记 flag[1] = 1d1 = [0 for i in range(n*2 - 1)] # 表示上对角线是否被标记,d[0+1] = 1d2 = [0 for i in range(n*2 - 1)] # 表示下对角线是否被标记count = 0de原创 2021-11-22 09:38:30 · 1441 阅读 · 0 评论 -
单向链表(Python)
# -*- coding:utf-8 -*-class Node(object): def __init__(self,item): # 结点 self.item = item self.next = Noneclass SingleList(object): """ 单链表 """ def __init__(self,node=None): self.__head = node def is_empty原创 2021-11-21 08:44:53 · 75 阅读 · 0 评论 -
优先队列(Python)
优先队列与队列一样,只能从队尾插入元素,从队首删除元素。但是它有一个特性,就是队列中最大或者最小的元素总是位于队首,所以出队时,并非按照先进先出的原则进行,而是将当前队列中最大或者最小的元素出队。这点类似于给队列里的元素进行了排序。我在这使用Python内置的一个库使用一下优先队列,上次提到的Dijkstra求最短路径的算法,就用到了优先队列。import heapqpqueue = []heapq.heappush(pqueue,(0,"A"))heapq.heappush(pqueue,(2原创 2021-11-19 20:18:46 · 3593 阅读 · 0 评论 -
图最短路径算法(Dijkstra) -- Python
狄克斯特拉(Dijkstra)算法也是求解最短路径问题的算法,使用它可以求得从起点到终点的路径中权重总和最小的那条路径路径。使用优先队列来实现,优先队列是依据二叉堆实现import heapqimport mathgraph = { "A":{"B":5,"C":1}, "B":{"A":5,"C":2,"D":1}, "C":{"A":1,"B":2,"D":4,"E":8}, "D":{"B":1,"C":4,"E":3,"F":6}, "E":{"C"原创 2021-11-18 17:27:10 · 962 阅读 · 0 评论 -
树是什么?
树是一种非线性结构,存储的是具有“一对多”关系的数据元素的集合下面列举一些树的相关定义结点:树中的每一个数据元素都被成为“结点”根结点:每一个非空树有且只有一个根节点(如果一个结点没有父结点,那么它就是这棵树的根结点)叶子结点:如果结点没有任何子结点,那么此结点称为叶子结点(叶结点)子树:其实就是以根结点的子结点为根节点组成的树(这里就可以认为,树是由根结点和子树组成)空树:空树中没有结点结点的度:对于一个结点,拥有的子树的个数就是结点的度结点的层次:举例:根结点在第一层,然后其子原创 2021-11-18 11:30:06 · 220 阅读 · 0 评论 -
栈和队列实现(Python)
栈(Stack):一种有次序的数据项集合,只能在同一端加入和移除,先进后出栈只有两种操作:入栈和出栈,不能用于查找日常应用:浏览器后退按钮,word的撤回操作""" 选择列表的右端入栈,然后只能从右端出栈 """class Stack(object): def __init__(self): self.items = [] def is_empty(self): # 判断栈是否为空 return self.items == [] def push(self,item): # 元素入栈原创 2021-11-18 09:56:13 · 398 阅读 · 0 评论 -
数据结构基础知识
什么是数据结构?简单理解,就是数据的存储方式数据存储方式的选择取决于两方面,即数据的逻辑结构和存储结构(物理结构)逻辑结构:简单理解,就是数据之间的逻辑关系线性结构(线性表):线性结构是一种有序数据项的集合,其存储的数据往往是可以依次排列的,具备“一对一”的逻辑关系,其中每个数据项都有唯一的前驱和后继。包括:1、顺序表:简单理解就是常用的数组,需要提前申请一定大小的存储空间,这块存储空间的物理地址是连续的2、链表:使用链表存储数据时,是随用随申请,因此数据的存储位置是相互分离的,不会占用一原创 2021-11-16 12:39:50 · 856 阅读 · 0 评论 -
二分查找(Python)
二分查找时间复杂度:O(logn)二分查找只能查找已经排好序的数据,通过比较数组中间的数据与目标数据的大小,可以得知目标数据是在数组的左边还是右边。因此,比较一次就可以把查找范围缩小一半。重复执行该操作就可以找到目标数据,或得出目标数据不存在的结论。# -*- coding = utf-8 -*-def binary_search(arr,l,r,x): m = int((l+r)/2) if x == arr[m]: return m elif x < arr[m]: ret原创 2021-11-10 14:10:27 · 369 阅读 · 0 评论 -
快速排序(C++、Python)
快速排序不稳定排序,时间复杂度O(nlogn)分而治之的一种解题思想。快速排序算法首先会在序列中随机选择一个基准值(pivot),然后将除了基准值以外的数分为“比基准值小的数”和“比基准值大的数”这两个类别,再将其排列成以下形式:[比基准值小的数] 基准值 [比基准值大的数]接着,对两个“[ ]”中的数据进行排序之后,整体的排序便完成了。对“[ ]”里面的数据进行排序时,同样也会使用快速排序。def partition(arr,low,high): i = low - 1 pivot = a原创 2021-11-08 22:13:26 · 161 阅读 · 0 评论 -
归并排序(Python)
归并排序稳定排序,时间复杂度O(nlogn)归并排序算法会把序列分成长度相同的两个子序列(如果序列长度为奇数,则一个序列比另一个序列多一个元素),当无法继续往下分时(也就是每个子序列中只有一个数据时),就对子序列进行归并。归并指的是把两个排好序的子序列合并成一个有序序列。该操作会一直重复执行,直到所有子序列都归并为一个整体为止。步骤:将原序列分成两个子序列将每一个子序列看成一个整体,继续拆分直至每个子序列,只有一个数据时,如下面所示。下面开始对分割的元素开始合并,合并时需要将数字按从大到小排原创 2021-11-08 22:00:43 · 326 阅读 · 0 评论 -
堆排序(Python)
堆排序堆排序的特点是利用了数据结构中的堆。堆是一种完全二叉树,将根节点大的堆叫做大根堆,根节点小的堆叫做小根堆。这里我用大根堆来进行演示,如下图所式,就是一个大根堆。步骤:首先取出根结点7重新构造堆然后再取出根结点的数字,再重新构造堆,依次进行,直到堆变空为止,排序完成。实现代码def heapify(tree,n,i): # 对堆的第i个结点,进行重构堆 c1 = 2*i + 1 # 第i个结点的子结点1 c2 = 2*i + 2 # 第i个结点的子结点2 max_index原创 2021-11-08 18:27:26 · 238 阅读 · 0 评论 -
冒泡排序、选择排序、插入排序(Python)
1、常见的几种排序方法冒泡排序(稳定排序、时间复杂度:O(n2) )冒泡排序就是重复“从序列右边开始比较相邻两个数字的大小,再根据结果交换两个数字的位置”这一操作的算法。在这个过程中,数字会像泡泡一样,慢慢从右往左“浮”到序列的顶端,所以这个算法才被称为“冒泡排序”。def bubble_sort(arr): n = len(arr) for i in range(n-1): for j in range(n-i-1): if arr[j] > arr[j+1]:原创 2021-11-08 16:23:44 · 452 阅读 · 0 评论