算法与数据结构

数据结构-图的最短路径之Djikstra算法(迪杰斯特拉算法)

三世轮回 提交于 2020-02-28 21:58:09
一. Djikstra算法定义 形式: 用来解决单源最短路径的问题,即给出图G和起点s,通过算法到达每个顶点的最短距离。 基本思想: 对图G(V, E)设置集合S, 存放已被访问的顶点,然后每次从集合V-S中选择与起点s的最短距离最小的一个顶点u,访问并加入集合S。之后,令顶点u为中介点, 优化起点和所有的从u能到达的顶点v之间的最短距离。这样的操作执行n(顶点的个数)次。 伪代码: //G为图, 一般设置为全局变量,数组d为源点到达各点的最短路径长度,s为起点 Djikstra(G, d[], s){ 初始化 for(循环n次){ u = 是d[u]最小的还未被访问的顶点的标号 记u已被访问 for(从u出发能到达的所有顶点v){ if(v未被访问&&以U为中介使得s到顶点v的最短距离d[v]更优){ 优化d[v] } } } } 二、具体实现 1. 邻接矩阵版 const int MAXV = 1000;//最大顶点数 const int INF = 10000000000;//设INF为一个很大数 //适用于点数不大的情况 int n, G[MAXV][MAXV]; int d[MAXV]; bool vis[MAXV]; void Dijkstra(int s){ fill(d, d+MAXV, INF); d[s] = 0; for(int i = 0; i < n; i

数据结构与算法学习笔记九 --- 快速排序算法

梦想与她 提交于 2020-02-28 18:51:27
快速排序算法(Quick Sort) 快速排序算法是一种递归排序算法; 其 原理 是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 简单点理解就是:以序列中的任意一个元素为基准(一般以第一个元素),通过逐个比较后,找到这个基准元素的合适位置(即在基准元素的左边元素都比它小,右边都比它大),这时在将序列分成左右两个部分,在继续上述的操作,直到不能再分为止(只有一个元素),此时排序也就完成。 快速排序过程图 快速排序算法的python实现 快速排序算法的代码实现最主要的是找到基准元素的位置,然后分成两部分,再用递归的方法,重复实现一样的操作。 代码如下: def quick_sort ( alist , first , last ) : """快速排序""" # 参数first,last:指定序列排序的位置起始和终止下标 # 只有当first小于last时才退出排序,此时元素只有一个。 if first >= last : return alist else : mid_value = alist [ first ] low = first high = last while low < high : # high 左移 while

java 数据结构与算法---栈

旧街凉风 提交于 2020-02-27 17:03:51
原理来自百度百科 一、栈的定义 栈是一种只能在一端进行插入和删除操作的特殊线性表;它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来);栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针;插入一般称为进栈(PUSH),删除则称为退栈(POP)。 二、栈的实现 package com.jalja.org.arith; public class MyStack<E>{ private Object [] arr;//存储 private int index;//栈元素实际入栈索引 private int maxSize;//栈的最大空间 private MyStack(int maxSize) { this.arr=new Object[maxSize]; this.index=0; this.maxSize=maxSize; } //入栈 public void push(E e) { if(isFull()) { throw new RuntimeException("myStack is full "); } arr[index++]=e; } //出栈 public E pop() { if(isNull()) { throw new RuntimeException("myStack

数据结构第二章

吃可爱长大的小学妹 提交于 2020-02-27 09:44:13
数据结构的第二章课程知识点 文章目录 数据结构的第二章课程知识点 名词简称 数据结构的体系 抽象数据类型 抽象数据类型的框架 抽象数据类型的表现和实现 线性结构 线性结构的基本特征 线性表 线性表的类型定义 抽象数据类型线性表(ADT List) 线性表的基本操作 **顺序表** 名词简称 名词 意义 DS(Data Strucuture) 数据结构 ADT/Abstract Date Type 抽象数据类型 List 线性表 SeqList/SqList 顺序表 LinkedList/LinkList/LIST 链表 数据结构的体系 是一种 线性结构 非线性结构 List SqList LinkList 顺序存储 链表存储 关系/逻辑结构 线性表 栈 队列 双队列 串 ...... 树 图 DS.数据结构 存储/物理结构 顺序存储 ..... 抽象数据类型 注: (A为 抽象 、B为 数据 、T为 类型 ) ADT Complex{ ① 数据对象 : D={e1,e2| e1,e2∈ RealSet } ② 数据关系 : R={<e1,e2>| e1 是复数的 实数部分 , e2 是负数的 虚数部分 。 ③ 基本操作 : AssignComplex(&Z,V1, V2) 操作结果:构造复数Z,其实部和虚部分别被赋以参数V1和V2的值。 DestroyComplex(&Z)

做了几年程序员,某天居然发现自己没学过数据结构。。。

左心房为你撑大大i 提交于 2020-02-27 03:06:10
原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者。 简介 学习编程,数据结构是你必须要掌握的基础知识,那么数据结构到底是什么呢? 根据百度百科的介绍,数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。 听听这是人话么,我帮你们翻译一下,其实数据结构就是用来描述计算机里存储数据的一种数学模型,因为计算机里要存储很多乱七八糟的数据,所以也需要不同的数据结构来描述。 本文思维导图 为什么要学数据结构 了解了基本概念之后,接下来我们再来看看,为什么我们要学习数据结构呢? 在许多类型的程序的设计中,数据结构的选择是一个基本的设计考虑因素。许多大型系统的构造经验表明,系统实现的困难程度和系统构造的质量都严重的依赖于是否选择了最优的数据结构。 许多时候,确定了数据结构后,算法就容易得到了。有些时候事情也会反过来,我们根据特定算法来选择数据结构与之适应。不论哪种情况,选择合适的数据结构都是非常重要的。 选择了数据结构,算法也随之确定,是数据而不是算法是系统构造的关键因素。这种洞见导致了许多种软件设计方法和程序设计语言的出现,面向对象的程序设计语言就是其中之一。 也就是说,选定数据结构往往是解决问题的核心,比如我们做一道算法题

数据结构与算法学习第一天

浪尽此生 提交于 2020-02-27 02:55:17
算法的概念 : 算法是计算机处理信息的本质。当算法处理信息时,会从输入设备或数据的存储地址读取数据,把结果写入输出设备或某个存储地址以供以后调用。 算法是独立存在的一种解决问题的方法和思路,语言并不重要,重要的是思想。 算法的特征 : 1.输入:算法具有0个或多个输入 2.输出:算法至少有一个或多个输出 3.有穷性:散发在有限的步骤之后会自动结束而不会无限 循环,并且每一步骤可以在可接受的时间内完成。 4.确定性:算法中的每一步都有确定的含义,不会出现二义性。 5.可行性:算法的每一步都是可行的,也就是说每一步都能够在执行有限的次数内完成。 实现算法程序的执行时间可以反应出算法的效率,即算法的优劣。同一个问题会有多种算法,算法之间的效率是有差别的。计算机执行环境不同,因此单纯依靠运行时间来比较算法的优劣并不一定是客观准确的。 时间复杂度与“大O记法” : “大O记法”:对于函数f,总有f(n)≤c*g(n),忽略常数c的情况下,函数g是f的一个渐进函数,记为f(n)=O(g(n))。也就是说,在去向无穷的极限意义下,函数f的增长速度受到函数g的约束,亦即函数f与函数g的特征相似。 时间复杂度:假设存在函数g,使得算法A处理规模为n的问题实例所用时间为T(n)=O(g(n)),则称T(n)=O(g(n))为算法A的渐进时间复杂度,简称时间复杂度,记为T(n)。例如

学习笔记2.26

纵然是瞬间 提交于 2020-02-27 02:28:37
2.26 9—11:30 看《Java疯狂讲义》 笔记: 15:00—17:30 上网课 :离散数学 看数据结构与算法 19:30—22:00 看数据结构与算法 散列查找 写博客 https://blog.csdn.net/huyidai/article/details/104521403 心得:离散数学 的第一节课感受到这是一门可以提高抽象思维和逻辑推理能力的课程,对程序语言设计与数据结构基础都是必不可少的课程。 来源: CSDN 作者: huyidai 链接: https://blog.csdn.net/huyidai/article/details/104523771

做了几年程序员,某天居然发现自己没学过数据结构。。。

孤街浪徒 提交于 2020-02-26 21:52:17
原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者。 简介 学习编程,数据结构是你必须要掌握的基础知识,那么数据结构到底是什么呢? 根据百度百科的介绍,数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。 听听这是人话么,我帮你们翻译一下,其实数据结构就是用来描述计算机里存储数据的一种数学模型,因为计算机里要存储很多乱七八糟的数据,所以也需要不同的数据结构来描述。 本文思维导图 为什么要学数据结构 了解了基本概念之后,接下来我们再来看看,为什么我们要学习数据结构呢? 在许多类型的程序的设计中,数据结构的选择是一个基本的设计考虑因素。许多大型系统的构造经验表明,系统实现的困难程度和系统构造的质量都严重的依赖于是否选择了最优的数据结构。 许多时候,确定了数据结构后,算法就容易得到了。有些时候事情也会反过来,我们根据特定算法来选择数据结构与之适应。不论哪种情况,选择合适的数据结构都是非常重要的。 选择了数据结构,算法也随之确定,是数据而不是算法是系统构造的关键因素。这种洞见导致了许多种软件设计方法和程序设计语言的出现,面向对象的程序设计语言就是其中之一。 也就是说,选定数据结构往往是解决问题的核心,比如我们做一道算法题

数据结构与算法初步认识

不羁岁月 提交于 2020-02-26 21:44:23
文章来源: http://blog.seclibs.com/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95%E5%88%9D%E6%AD%A5%E8%AE%A4%E8%AF%86-2/ 什么是数据结构和算法 数据结构和算法经常是结合在一起的东西,数据结构是数据的存储方式,而算法是对数据的具体操作,他们二者是相辅相成的,数据结构是为算法服务的,算法是要作用在特定的数据结构之上的,两者是不可以孤立存在的。 在平时我们所遇到的数据结构和算法有以下一些 整个列表的内容下来还是非常多的,这里不立什么flag,只是为了给之后所学习的内容做一个更好的铺垫。 数据结构和算法的应用就是为了解决程序的快和省的问题,即运行的够快,占用的空间够少,在评比这两项内容的时候,我们引入了时间复杂度和空间复杂度两个复杂度的概念。虽然说我们可以在写完程序后对程序的时间进行计算和统计等,但那属于事后统计法,有一种事后诸葛亮的感觉,我们需要的是在写程序的时候就对整体的复杂性有一个大概的评估。 这里我们引入的是大O表示法,T(n)=O(f(n)),其中,T(n) 表示代码执行的时间;n 表示数据规模的大小;f(n) 表示每行代码执行的次数总和。因为这是一个公式,所以用 f(n) 来表示。公式中的 O,表示代码的执行时间 T(n) 与 f(n)

数据结构与算法(树)

巧了我就是萌 提交于 2020-02-26 19:13:10
树的定义 树(Tree)是n(n>=0)个结点的有限集。当n=0时成为空树,在任意一棵非空树中: 1 有且仅有一个特定的称为根(Root)的结点; 2 当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1、T2、.Tm,其中每一个集合本身又是棵树,并且称为根的子树( Subtree) 注意: n>时,根结点是唯一的,坚决不可能存在多个根结点 m>θ肘,子树的个数是没有限制的,但它们互相是定不会相交的。 结点 结点分类 图片中,每一个圈圈我们就称为树的一个结点。结点拥有的子树数称为结点的度 ( Degree),树的度取树内各结点的度的最大值。 度为0的结点称为叶结点(Leaf)或终端结点; 度不为θ的结点称为分支结点或非终端结点,除根结点外,分支结点也称为内部结点。 结点间的关系 结点的子树的根称为结点的孩子(Child),相应的,该结点称为孩子的双亲( Parent),同一双亲的孩子之间互称为兄弟(Sibling)。 结点的祖先是从根到该结点所经分支上的所有结点。 结点的层次 结点的层次(Level)从根开始定一起,根为第一层,根的孩子为第二层。 其双亲在同一层的结点互为堂兄弟。 树中结点的最大层次称为树的深度( Depth)或高度。 其他概念 如果将树中结点的各子树看成从左至右是有次序的,不能互换的,则称该树为有序树,否则称为无序树。 森林( Forest)是m(m>=0