算法与数据结构

数据结构与算法第一天

*爱你&永不变心* 提交于 2020-01-26 04:22:30
Task01:数组(1天) 理论部分: 理解数组的存储与分类。 实现动态数组,该数组能够根据需要修改数组的长度。 练习部分 1 利用动态数组解决数据存放问题 编写一段代码,要求输入一个整数N,用动态数组A来存放2~N之间所有5或7的倍数,输出该数组。 def findn ( n ) : A = [ ] for i in range ( 2 , n + 1 ) : if i % 5 == 0 or i % 7 == 0 : A . append ( i ) print ( A ) findN ( 100 ) print ( 'totally cost' ) 托普利茨矩阵问题 如果一个矩阵的每一方向由左上到右下的对角线上具有相同元素,那么这个矩阵是托普利茨矩阵。 给定一个M x N的矩阵,当且仅当它是托普利茨矩阵时返回True。 class Solution : def isToeplitzMatrix ( self , matrix : List [ List [ int ] ] ) - > bool : for j in range ( len ( matrix [ 0 ] ) - 1 ) : for i in range ( len ( matrix ) - 1 ) : if matrix [ i ] [ j ] != matrix [ i + 1 ] [ j + 1 ] :

数据结构与算法之美(一)——为什么学习算法,怎么学习算法

荒凉一梦 提交于 2020-01-26 01:40:27
一,为什么学习算法? 1. 算法是计算机学习的重要基石之一,学好算法对理解层出不穷的框架有着决定行作用。 2. 学习算法,有利于写出高性能的代码。 3. 长期来看,大脑思考能力是个人最重要的核心竞争力,而算法是为数不多的能够有效训练大脑思考能力的途径之一。 4. 算法,是一种解决问题的思路和方法,有机会应用到生活和事业的其他方面 二,学习技巧 1. 边学边练,适度刷题 2. 多问、多思考、多互动 3. 算法学习枯燥难耐,需要坚持不懈 4. 边学边练,定时复习 来源: CSDN 作者: resource19610 链接: https://blog.csdn.net/qq_41201565/article/details/104027982

算法与数据结构

浪子不回头ぞ 提交于 2020-01-25 19:24:50
算法与数据结构 第二天打卡 1.合并两个有序链表 public ListNode mergeTwoLists ( ListNode l1 , ListNode l2 ) { //创建一个新的链表节点 ListNode head = new ListNode ( 0 ) ; ListNode prev = head ; while ( l1 != null && l2 != null ) { if ( l1 . val <= l2 . val ) { prev . next = l1 ; l1 = l1 . next ; } else { prev . next = l2 ; l2 = l2 . next ; } prev = prev . next ; } prev . next = l1 == null ? l2 : l1 ; return head . next ; } 2.删除链表的倒数第N个节点 public ListNode removeNthFromEnd ( ListNode head , int n ) { int count = 0 ; ListNode prev = new ListNode ( 0 ) ; prev . next = head ; ListNode curr = prev ; while ( head != null ) { count ++

数据结构和算法关系

好久不见. 提交于 2020-01-25 09:26:57
数据结构:数据与数据之间的结构关系(数组、队列、树、图等结构) 算法:解决问题的步骤 总结: 1、程序 = 数据结构 + 算法 。数据是程序的中心。数据结构和算法两个概念间的逻辑关系贯穿了整个程序世界,首先二者表现为不可分割的关系。没有数据间的有机关系,程序根本无法设计。 2、数据结构与算法关系:数据结构是底层,算法高层。数据结构为算法提供服务。算法围绕数据结构操作。 3、解决问题(算法)需要选择正确的数据结构。例如:算法中经常需要对数据进行增加和删除用链表数据结构效率高,数组数据结构因为增加和删除需要移动数字每个元素所有效率低。 4、数据结构特点:每种数据结构都具有自己的特点。例如:队列:先进先出。栈:先进后出。等等 5、算法的特性:算法具有五个基本特征:输入、输出、有穷性、确定性和可行性。 6、数据结构应用:数据结构往往同高效的检索算法、索引技术、排序算法有关 7、数据结构(逻辑数据结构)通过计算机语言来实现数据结构(存储数据结构)。例如:树型数据结构:通过计算机语言中的数组(节点)和指针(指向父节点)来实现。 8、存储结构:逻辑数据结构的实现。存储结构通过计算机语言实现。 例如:堆数据结构,堆是一棵完全二叉树,所以适宜采用顺序存储结构(顺序存储:数组),这样能够充分利用存储空间。 9、算法目的:算法是为数据结构服务。例如:数据结构通常伴随有查找算法、排序算法等 10

用Python实现数据结构之树

时光怂恿深爱的人放手 提交于 2020-01-25 06:11:58
树 树是由根结点和若干颗子树构成的。树是由一个集合以及在该集合上定义的一种关系构成的。集合中的元素称为树的结点,所定义的关系称为父子关系。父子关系在树的结点之间建立了一个层次结构。在这种层次结构中有一个结点具有特殊的地位,这个结点称为该树的根结点,或称为树根。 相关概念 根节点:树中最顶部的元素 父节点:处了根节点都有父节点,每个节点最多只有一个父节点 孩子节点:一个父节点具有0个或多个孩子节点 兄弟节点:同一个父节点的孩子节点之间是兄弟关系 外部节点:一个没有孩子的节点称为外部节点,也叫叶子结点 内部节点:有一个或多个孩子节点的节点叫做内部节点 树的边:指一对节点(u,v),其中u是v的父节点或者v是u的父节点 树的路径:一系列连续的边组成了一条路径 节点的深度:节点的深度就是该节点的祖先的个数,不包括该节点本身,如果根节点的层数为1,则深度即为该节点的层数-1 节点的高度:如果p是树中的叶子节点,那么它的高度为0.否则p的高度是它的孩子节点中的最大高度+1 有序树:每个孩子之间有一定的顺序,例如: 一个树的抽象基类 class Tree(): """ 树的抽象基类 """ # 叫做位置的内嵌类,用于封装节点 class Position(): def element(self): raise NotImplementedError('must be implemented by

数据结构(简易版)

大城市里の小女人 提交于 2020-01-25 05:37:46
什么是数据结构 数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。 数据结构有很多种,一般来说,按照数据的逻辑结构对其进行简单的分类,包括线性结构和非线性结构两类。 线性结构: 1、线性结构是非空集。 2、线性结构有且仅有一个开始结点和一个终端结点。 3、线性结构所有结点都最多只有一个直接前趋结点和一个直接后继结点。 非线性结构 1、非线性结构是非空集。 2、非线性结构的一个结点可能有多个直接前趋结点和多个直接后继结点。 ——百度百科 链表 链表是一种数据元素按照链式存储结构进行存储的数据结构,这种存储结构具有在物理上存在非连续的特点。链表由一系列数据结点构成,每个数据结点包括数据域和指针域两部分。其中,指针域保存了数据结构中下一个元素存放的地址。链表结构中数据元素的逻辑顺序是通过链表中的指针链接次序来实现的。 正在链表中,数据的添加和删除都比较方便,但是访问比较耗费时间。 在链表中,数据一般分散储存在内存中,并没有顺序,只能依靠指针找到下一个数据。所以数据访问只能从表头一个个查找下去。 由于依靠指针链接下一个数据,所以链表添加数据时,只需改变添加位置前后指针即可;而删除数据,只需改变被删除数据的前一个数据指针。 链表表示:

数据结构第五篇——线性表的链式存储之循环链表

你说的曾经没有我的故事 提交于 2020-01-25 05:23:34
♥注:未经博主同意,不得转载。   链表是另一种形式的链式存储结构,它是线性链表的一种变形。在线性链表中,每个结点的指针都指向它的下一个结点,最后一个结点的指针域为空,表示链表的结束。若使最后一个结点的指针指向头结点,则链表呈环状,这样的链表称为 循环链表 。 循环链表当然也分为 单链表 和 双向列表 。 通常情况下,在循环链表中设立尾指针而不设头指针,可使某些操作简化。 循环链表的定义和操作与单链表类似,只是循环结束条件有所不同,下面只给出单循环链表的定义和部分操作,至于双向循环链表可能会在以后的项目中出现,到时再进一步探讨。 单循环链表定义如下: 1 typedef int Data; 2 3 struct Node 4 { 5 Data data; //数据 6 Node* next; //指向后继的指针 7 }; 8 9 class CList 10 { 11 Node* head; //创建头结点 12 public: 13 CList() //构造函数 14 { 15 head = new Node; 16 head->next = head; //头尾相接 17 } 18 ~CList(); //析构函数 19 20 Data GetElem(int i); //取第i个元素的值 21 bool IsEmpty(); //判断是否为空链表 22 void Create

数据结构之链表

雨燕双飞 提交于 2020-01-25 04:46:34
数据需要一块连续的内存空间来存储,对内存的要求比较高。而链表恰恰相反,它并不需要一块连续的内存空间,它通过“ 指针 ”将一组 零散 的内存块串联起来使用。 最常见的链表:单链表、双链表、和循环链表。 单链表 结点 :除了存储数据之外,还要记录链上的下一个节点的地址,如下图,我们把这个记录下个结点地址的指针叫作 后继指针 next 头结点 :用来记录链表的基地址。 尾结点 :指向一个空地址 NULL 针对链表的插入和删除操作,只需考虑相邻结点的指针改变,所以对应的时间复杂度是O(1)。 链表想要随机访问第k个元素,就没有数组那么高效,链表的数据并非连续存储的,所以无法像数组那样,根据首地址和下标通过寻址公式就能直接计算出对应的内存地址,而是要根据指针一个结点一个结点的一次遍历,直到找到相应的结点。需要 O(n)时间复杂度 。 循环链表 是一种特殊的单链表。它和单链表唯一的区别就在尾结点。循环链表的 尾结点指针是指向链表的头结点 。 当处理的数据具有环形结构特点时,就特别适合采用循环链表。 双向链表 双向链表支持双向遍历,它需要额外的两个空间来存储后继结点和前驱结点的地址。 时空替换思想 :“用空间换时间” 与 “用时间换空间” 当内存空间充足的时候,如果我们更加追求代码的执行速度,我们就可以选择空间复杂度相对较高,时间复杂度小相对较低的算法和数据结构,缓存就是空间换时间的例子

数据结构与算法——暴力递归

偶尔善良 提交于 2020-01-25 00:41:15
暴力递归就是尝试 1, 把问题转化为规模缩小了的同类问题的子问题 2, 有明确的不需要继续进行递归的条件(base case) 3, 有当得到了子问题的结果之后的决策过程 4, 不记录每一个子问题的解 一定要学会怎么去尝试,因为这是动态规划的基础,这一内容我们将在提升班讲述 汉诺塔问题 打印n层汉诺塔从最左边移动到最右边的全部过程 public static void hanoi(int n) { if (n > 0) { func(n, "左", "右", "中"); } } // 1~i 圆盘 目标是from -> to, other是另外一个 public static void func(int N, String from, String to, String other) { if (N == 1) { // base System.out.println("Move 1 from " + from + " to " + to); } else { func(N - 1, from, other, to); System.out.println("Move " + N + " from " + from + " to " + to); func(N - 1, other, to, from); } } 打印一个字符串的全部子序列,包括空字符串 public static

数据结构与算法

廉价感情. 提交于 2020-01-24 20:57:42
观点1 我们无法孤立数据结构来讲算法,也无法孤立算法来讲数据结构。 比如,因为数组具有随机访问的特点,常用的二分查找算法需要用数组来存储数据。但如果 我们选择链表这种数据结构,二分查找算法就无法工作了,因为链表并不支持随机访问。 来源: https://www.cnblogs.com/xzqpy/p/12232538.html