数据结构

数据结构与算法系列八(递归见面礼)

你离开我真会死。 提交于 2020-03-04 12:56:40
1.引子 1.1.为什么要学习数据结构与算法? 有人说,数据结构与算法,计算机网络,与操作系统都一样,脱离日常开发,除了面试这辈子可能都用不到呀! 有人说,我是做业务开发的,只要熟练API,熟练框架,熟练各种中间件,写的代码不也能“飞”起来吗? 于是问题来了:为什么还要学习数据结构与算法呢? #理由一: 面试的时候,千万不要被数据结构与算法拖了后腿 #理由二: 你真的愿意做一辈子CRUD Boy吗 #理由三: 不想写出开源框架,中间件的工程师,不是好厨子 1.2.如何系统化学习数据结构与算法? 我想好了,还是需要学习数据结构与算法。但是我有两个困惑: 1.如何着手学习呢? 2.有哪些内容要学习呢? 学习方法推荐: #学习方法 1.从基础开始,系统化学习 2.多动手,每一种数据结构与算法,都自己用代码实现出来 3.思路更重要:理解实现思想,不要背代码 4.与日常开发结合,对应应用场景 学习内容推荐: 数据结构与算法内容比较多,我们本着实用原则,学习经典的、常用的数据结构、与常用算法 #学习内容: 1.数据结构的定义 2.算法的定义 3.复杂度分析 4.常用数据结构 数组、链表、栈、队列 散列表、二叉树、堆 跳表、图 5.常用算法 递归、排序、二分查找 搜索、哈希、贪心、分治 动态规划、字符串匹配 2.考考你 到目前为止,基于线性表的数据结构我们都看完了,简单回顾一下,它们是:数组

数据结构和算法-知识点总结

回眸只為那壹抹淺笑 提交于 2020-03-04 10:01:20
时间复杂度 1、假设计算机执行每个基本操作的时间是固定的时间单位,那么有多少基本操作步骤就代表有多少时间单位。虽然不同机器的时间单位不同,但是执行基本操作是相同的,因此可以使用步骤来客观描述代码的时间复杂度。 2、时间复杂度用大(O)记法表示。 3、T(n) = n^2 x 2, 关注趋势图的话可省略 x 2, 所以下面这个函数的时间复杂度可用g(n) = n^2表示 g(n) 和T(n) 相差 x2 的操作,g(n)是T(n)的渐近函数,记为f(n) = O(g(n)),即趋向无穷极限时,函数的增长速度受到g(n)的约束。 def a ( n ) : # 操作步骤=n for i in range ( n ) : # 操作步骤=n for j in range ( n ) : # 操作步骤=1步(i**2)+1步(j**3)+1步(i**2+j**3)+ 1步(c = i**2+j**3), #基本操作对趋势图影响不大,所以可以简单的看成是1步 c = i ** 2 + j ** 3 # 操作步骤=1步 print ( c ) 4、大(O)记法表示法用g(n)表示 算法 算法是一种思想,一种解决问题的思路,关注的是解决问题的步骤和思想,不关注处理的数据类型。 数据结构 1、数据的保存方式叫作数据结构 2、数据结构用于描述数据元素之间的关系,数据的组织方法会影响算法的时间复杂度

数据结构 - 特殊接口、类

旧街凉风 提交于 2020-03-04 07:43:06
Iterable 接口: Iterable 的子类必须实现iterator()方法,次方法会返回迭代器对象。 Iterable最早出现在JDK 1.5,开始只有iterator()一个抽象方法,需要子类来实现一个内部迭代器Iterator遍历元素.后两个方法是Java 8后新添加的,forEach(Consumer action)是为了方便遍历操作集合内的元素,spliterator()则提供了一个可以并行遍历元素的迭代器,以适应现在cpu多核时代并行遍历的需求.   其中我们可以看下default修饰符,这也是Java 8后新出现的,我们知道,如果我们给一个接口新添加一个方法,那么所有他的具体子类都必须实现此方法,为了能给接口拓展新功能,而又不必每个子类都要实现此方法,Java 8新加了default关键字,被其修饰的方法可以不必由子类实现,并且由dafault修饰的方法在接口中有方法体,这打破了Java之前对接口方法的规范. 来源: CSDN 作者: 袁江南 链接: https://blog.csdn.net/nan8426/article/details/104615905

字符串和常用的数据结构之约瑟夫环问题

匆匆过客 提交于 2020-03-04 06:37:09
约瑟夫环问题 “”" 有15个基督徒和15个非基督徒, 大家围成圈, 由某个人开始从1报数,报到9的人扔到海里面; 他后面的人接着从1开始报数,报到9的人扔到海里面,直到扔掉15个人 最后15个基督徒都幸免于难,为啥 “”" def main ( ) : persons = [ True ] * 30 counter , index , number = 0 , 0 , 0 while counter < 15 : if persons [ index ] : number += 1 if number == 9 : persons [ index ] = False counter += 1 number = 0 index += 1 index %= 30 for person in persons : print ( '基' if person else '非' , end = '||' ) if __name__ == '__main__' : main ( ) 找出座位号 def main ( n , k ) : # n代表总人数,k代表报数的数字 List = list ( range ( 1 , n + 1 ) ) index = 0 while List : temp = List . pop ( 0 ) index += 1 if index == k :

大话数据结构第三章

你。 提交于 2020-03-04 06:14:51
线性表:另个或多个数据元素的有限序列 首先是线性的,单列的,一个数据元素后面或者前面不能同时对应两个元素,只能对应一个元素,这个前面的元素叫做直接前驱元素,后面的元素叫做直接后继元素。元素个数为0的时候,称为空表。 在比较复杂的线性表中,一个数据元素可以由若干个数据项组成。 线性表抽象数据类型,还介绍几种基本操作吧: InitList(*L) 初始化操作,证明L表是空的。 ListEmpty(L) 若列表为空,返回true 否则返回false ClearList(*L) 清空表 GetElem(L ,i,*e) 将线性表中的第i个元素值返回给e LocateElem(L,e) 在线性表中查找与给定值e相等的元素,如果查找成功,返回该元素在表中序号表示成功;否则,返回0表示失败。 ListInsert (*L,i,e) 在线性表L中的第i个位置插入新元素e ListDelete(*L,i,e) 删除线性表L中第i个元素位置,并用e返回其值。 ListLength(L) 返回线性表L中的元素个数 3.4 线性表的顺序存储结构 指的是用一段地址连续的存储单元一次存储线性表的数据元素 数组的长度和线性表的长度有区别:数组的长度是存放线性表的存储空间的长度,存储分配之后一般这个量是不变的。 线性表的长度是线性表中的数据元素的个数,随着线性表的插入和删除操作的进行,这个量是变化的。

字符串和常用的数据结构之打印杨辉三角

南笙酒味 提交于 2020-03-04 03:53:37
打印杨辉三角 def main ( ) : num = int ( input ( 'Number of rows: ' ) ) yh = [ [ ] ] * num for row in range ( len ( yh ) ) : yh [ row ] = [ None ] * ( row + 1 ) for col in range ( len ( yh [ row ] ) ) : if col == 0 or col == row : yh [ row ] [ col ] = 1 else : yh [ row ] [ col ] = yh [ row - 1 ] [ col ] + yh [ row - 1 ] [ col - 1 ] print ( yh [ row ] [ col ] , end = '\t' ) print ( '\n' ) print ( ) if __name__ == '__main__' : main ( ) 来源: CSDN 作者: 匡夆 链接: https://blog.csdn.net/weixin_46108954/article/details/104637739

字符串和常用的数据结构之设计一个函数返回给定文件名的后缀名

蓝咒 提交于 2020-03-03 22:02:42
设计一个函数返回给定文件名的后缀名 def get_suffix ( filename , has_dot = False ) : """ 获取文件名的后缀名 :param filename:文件名 :param has_dot:返回的后缀名是否需要带点 :return:文件的后缀名 """ pos = filename . rfind ( '.' ) if 0 < pos < len ( filename ) - 1 : index = pos if has_dot else pos + 1 return filename [ index : ] else : return '' 测试 print ( get_suffix ( 'aa' ) ) print ( get_suffix ( 'aa.txt' ) ) print ( get_suffix ( 'aa.py' ) ) print ( get_suffix ( 'aa.txt.py' ) ) 来源: CSDN 作者: 匡夆 链接: https://blog.csdn.net/weixin_46108954/article/details/104637432

程序中的耦合与解耦学习(一)——耦合性

狂风中的少年 提交于 2020-03-03 21:24:47
本文供自己学习笔记使用,参考了百度百科以及网友总结的知识点 百度百科 参考文档1-简书网友 一、耦合性 耦合性(Coupling),也叫耦合度,是对模块间关联程度的度量。耦合的强弱取决于模块间接口的复杂性、调用模块的方式以及通过界面传送数据的多少。模块间的耦合度是指模块之间的依赖关系,包括控制关系、调用关系、数据传递关系。模块间联系越多,其耦合性越强,同时表明其独立性越差( 降低耦合性,可以提高其独立性)。软件设计中通常用耦合度和内聚度作为衡量模块独立程度的标准。划分模块的一个准则就是高内聚低耦合。 耦合性也叫块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块之间越独立则越差,模块间耦合的高低取决于模块间接口的复杂性,调用的方式以及传递的信息。 形象的说,就是要将代码写的和电脑一样,主类就是电脑的主机箱,当程序需要实现什么功能的时候只需要在其他的类引入接口,就像电脑上的usb接口。 二、耦合性构成 简介 一般模块之间可能的连接方式有七种,构成耦合性的七种类型。它们之间的关系为(独立性由强到弱)以下; 1、非直接耦合(Nondirect Coupling) 如果两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的,这就是非直接耦合。这种耦合的模块独立性最强。 2、数据耦合(Data Coupling)

数据结构---链表

一笑奈何 提交于 2020-03-03 20:57:54
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 typedef struct Node 5 { 6 int data; //数据域 7 struct Node * pNext;//指针域 8 }NODE,*PNODE; 9 10 //函数声明 11 PNODE creat_list(void); 12 void traverse_list(PNODE pHead); 13 bool is_empty(PNODE pHead); 14 int length_list(PNODE pHead); 15 bool insert_list(PNODE ,int,int); 16 bool delete_list(PNODE,int,int *);// int*表示删除的数字 17 void sort_list(PNODE); 18 19 20 int main (void) 21 { 22 PNODE pHead = NULL; 23 int val; 24 25 pHead = creat_list();//创建一个非循环单链表 ,并将该链表的头结点的地址付给pHead; 26 traverse_list(pHead); 27 insert_list(pHead,4,33); 28 traverse_list(pHead); 29

考研复试机试--数据结构

自闭症网瘾萝莉.ら 提交于 2020-03-03 20:15:21
向量 #include vector 长度不定的数组 时间:越长越好 空间:越少越好 进行一次插入:O(n) 进行n次插入:O(n^2) C++中数组溢出会自动成倍扩容 vector的使用,即向量的构造 int myArray [ ] = { 1 , 2 , 3 , 4 , 5 } ; vector < int > myVector1 ; vector < int > myVector2 ( myArray , myArray + 5 ) ; //1 2 3 4 5 vector < int > myVector3 ( 5 , 2 ) ; //2 2 2 2 2 vector < int > myVector4 ( myVector2 ) ; //1 2 3 4 5 vector < int > myVector5 ( myVector4 . begin ( ) , myVector4 . end ( ) ) ; //1,2,3 ,4,5 //只能一个一个输出 cout << myVector5 [ 2 ] ; vector的常用操作 int myArray [ ] = { 1 , 2 , 3 , 4 , 5 } ; //定义myVector vector < int > myVector ( myArray , myArray + 5 ) ; //1 2 3 4 5 //计算长度