算法与数据结构

数据结构与算法应用

喜欢而已 提交于 2019-12-02 10:50:44
16.1 数据结构与算法应用基础 算法灵活度高,不容易拿分,拿部分分6-8分就不错啦 16.2 分治法 往往运用递归解决问题 16.3 分治法(递归技术):必须掌握,不然很多问题难以理解 递归:就是函数在运行的过程中调用自己 为什么调用自己:我们要解决的问题可以才分为多个同类型的子问题,既然函数是用来解决这个复杂问题的,那么函数也可以解决子问题,所以自己调自己。 16.4 分治法具体应用(二分查找) 16.5 回溯法--深度优先 解决经典的迷宫问题 16.6 贪心法(性价比) 每一步都选择最好的东西所以叫贪心法 特色:在短时间找出解,但不一定是最优解 16.7 动态规划法(在逻辑方面非常复杂) 分治法与动态的区别: 动:子问题的解与原问题可能有关联,将子问题的解存在一个表中 动态规划法会构造出一个表去 查表 16.8 数据结构与算法应用分析1 解题思路:先解决其他方面的问题,再解决代码问题,有促进作用 16.9 案例2 来源: https://blog.csdn.net/shujuku____/article/details/102752858

STL与基础数据结构

二次信任 提交于 2019-12-02 06:59:26
内容参考书籍《算法竞赛入门到进阶》 1.vector。   数组是基本数据结构,有静态数组和动态数组,在比赛中如果空间足够,能用静态数组就用数组,在空间紧张的情况下可以使用STL的vector建立动态数组。   vector是STL的动态数组,在运行时能根据需要改变数组大小。vector容器是一个模板类,能存放任何类型的对象。 1 vector<int> a;//默认初始化,为空 2 vector<int> b(a);//用a定义b 3 vector<int> a(100);//a有100个值为0的元素 4 vector<int> a(100,6);//100个值为6的元素 5 vector<string> a(10,"null");//10个值为null的元素 6 vector<string> vec(10,"hello");//10个值为hello的元素 7 vector<string> b(a.begin(),a.end());//b是a的复制 8 struct point {int x,y;}; 9 vector<point>a;//a用来存坐标(或者向量???或者其他东西?) View Code   当然还可以定义多维数组,例如vector<int>a[MAXN];它的一维是固定的MAXN,二维是动态的。用这种方式可以实现图的邻接表的存储。   vector常用操作:

数据结构之单链表

吃可爱长大的小学妹 提交于 2019-12-02 06:53:39
基本概念 数据项: 是描述客观事物的符号,是计算机可以直接操作的对象,是能被计算机识别,并能输入给计算机处理的符号集合 数据元素: 是组成数据的、有一定意义的基本单位,在计算机中通常作为整体处理,也被称之为记录 数据项: 一个数据元素可以由若干个数据项组成,数据项是数据元素不可分割的最小单位 数据对象: 是性质相同的数据元素的集合,是数据的子集 数据结构: 是相互之间存在一种或者多种特定关系的数据元素集合 逻辑结构和物理结构 逻辑结构: 是指数据对象中数据元素之间的相互关系,分为以下几种 集合结构:数据元素除了同属于一个集合以外,他们之间没有任何其他的关系, 线性结构:数据元素之间是一对一的关系(例如一个保存序号的数组) 树形结构:数据元素之间存在一种一对多的层次关系(例如文件目录树) 图形结构:数据元素是多对多的关系 物理结构 :指在内存中的存储顺序 顺序存储结构:把数据放在连续的存储单元里,其数据之间的关系和物理关系是一致的(例如 int nNum[3] = {1,2,3};这类数据) 链式存储结构:是把数据元素放到任意存储单元里,这组存储单元可以是连续的,也可以不是连续的 算法的事件复杂度 用来衡量算法的优劣 大O阶方法: 1、常数阶 2、线性阶 3、对数阶 4、平方阶 所耗费的时间按复杂度从小到大依次是: 顺序线性表(向量) 基本概念

数据结构与算法(Python)—— (三)数据结构的概念

别来无恙 提交于 2019-12-02 06:43:30
有这样一个需求:用Python中的类型来保存一个班的学生信息,之后快速的通过学生姓名获取其详细信息。我们如何实现呢? 实际上当我们在思考这个问题的时候,我们已经用到了数据结构。列表和字典都可以存储一个班的学生信息,但是想要在列表中获取一名同学的信息时,就要遍历这个列表,其时间复杂度为O(n),而使用字典存储时,可将学生姓名作为字典的键,学生信息作为值,进而查询时不需要遍历便可快速获取到学生信息,其时间复杂度为O(1)。 我们为了解决问题,需要将数据保存下来,然后根据数据的存储方式来设计算法实现进行处理,那么数据的存储方式不同就会导致需要不同的算法进行处理。我们希望算法解决问题的效率越快越好,于是我们就需要考虑数据究竟如何保存的问题,这就是数据结构。在上面的问题中我们可以选择Python中的列表或字典来存储学生信息。列表和字典就是Python内建帮我们封装好的两种数据结构。 1. 概念 数据 是一个抽象的概念,将其进行分类后得到程序设计语言中的基本类型。如:int,float,char等。数据元素之间不是独立的,存在特定的关系,这些关系便是结构。 数据结构指数据对象中数据元素之间的关系。 Python给我们提供了很多现成的数据结构类型,这些系统自己定义好的,不需要我们自己去定义的数据结构叫做Python的内置数据结构,比如列表、元组、字典。而有些数据组织方式

数据结构与算法(2)数组

旧巷老猫 提交于 2019-12-02 06:24:53
数组 一、什么是数组? 数组是一种线性表数据结构。他用一组连续的内存空间,来存储一组具有相同类型的数据。 线性表 线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表、队列、栈等也是线性表结构。而与它对立的概念是非线性表,比如二叉树、堆、图等。之所以叫非线性,是因为,非线性表中,数据之间并不是简单的前后关系。 连续的内存空间和相同类型的数据 数组正是因为这两个限制,它才有了一个堪称“杀手锏”的特性:“随机访问”。但有利就有弊,这两个限制也让数组的很多操作变得非常低效,比如想在数组中删除、插入一个数据,为了保证连续性,就需要做大量的数据搬移工作。 寻址公式 a[i]_address = base_address + i * data_type_size base_address为内存块的首地址 i为数组中元素所在 data_type_size表示数组中每个元素的大小 低效的“插入”和“删除” 插入操作 如果在数组末尾插入元素就不需要移动数据,这时的时间复制度为O(1)。但如果在数组的开头插入元素,那所有的数据都需要依次向后移动一位,所以最坏的时间复制度为O(n)。因为我们在每个位置插入元素的概率是一样的,所以平均情况时间复制度为(1+2+...n)/n=O(n)。 如果数组是有序的,如果要将某个数据插入到第k个位置

redis底层实现的几种数据结构

匆匆过客 提交于 2019-12-02 01:51:47
redis底层数据结构 一、简单动态字符串(SDS) 定义: struct sdshdr{   int len; //SDS所保存的字符串长度   int free //记录buf数组中为使用的字节数量,预留内存长度   char buf[] //字节数组,用于保存字符串 } SDS与C字符串的区别及特点: 1)获取字符串长度:   C字符串:遍历整个字符串,直至遇到结束符为止,复杂度为O(n)。   SDS:在len中记录了本身的长度,所以获取一个SDS长度的复杂度为O(1)。 2)杜绝缓存区溢出   C字符串:不记录本身的长度,当将一个字符串拼接到另一个字符串的末尾时,如果内存不够多的话,就会产生缓存区的溢出。   SDS:在进行拼接之前,会先检查给定的SDS空间是否足够,如果不够,会先扩展SDS的空间,然后才执行拼接操作。 3)减少内存重新分配次数   SDS:通过空间预分配额外空间作为保留使用,从而减少内存的重分配为题。   额外分配空间数量的公式:     1、当SDS的长度小于1MB的时候,分配与len属性的值相同长度的内存作为预存。(实际上所有的长度将多一字节保存空字符)     2、当SDS的长度大于等于1MB的时候,那么程序会分配1MB的未使用空间。 4)惰性空间释放   SDS的API需要缩短SDS保存的字符串时

Python学习教程(Python学习视频_Python学习路线):Python数据结构

时间秒杀一切 提交于 2019-12-02 01:04:44
Python学习教程(Python学习视频_Python学习路线):Python数据结构 概述 数据结构是组织数据的方式,以便能够更好的存储和获取数据。数据结构定义数据之间的关系和对这些数据的操作方式。数据结构屏蔽了数据存储和操作的细节,让程序员能更好的处理业务逻辑,同时拥有快速的数据存储和获取方式。 在这篇文章中,你将了解到多种数据结构以及这些数据结构在Python中实现的方式。 抽象数据类型和数据结构 数据结构是抽象数据类型(ADT)的实现,通常,是通过编程语言提供的基本数据类型为基础,结合相应的代码来实现。 通常来说,数据结构分为两类:原始数据结构和非原始数据结构,原始数据结构是用来表示简单的数据关系,非原始数据结构包含原始数据结构,同时,数据关系更加复杂,数据操作也更加复杂。 原始数据结构 原始数据结构 - 顾名思义 - 是最原始的或基本的数据结构。 它们是数据操作的构建块,包含纯粹,简单的数据值。 Python有四种原始变量类型: Integers Float Strings Boolean Integers 您可以使用Integers表示数字数据,具体地说,可以使用从负无穷大到无穷大的整数 Float “Float”代表“浮点数”。 您可以将它用于有理数,通常以十进制数字结尾,例如1.11或3.14。 请注意,在Python中,您不必显式声明变量或数据的类型。

Redis 系列(02)数据结构

Deadly 提交于 2019-12-02 00:10:28
目录 Redis 系列(02)数据结构 Redis 系列目录 1. String 1.1 基本操作 1.2 数据结构 1.3 Redis数据存储结构 2. Hash 2.1 基本操作 2.2 数据结构 3. List 3.1 基本操作 3.2 数据结构 4. Set 4.1 基本操作 4.2 数据结构 5. Sorted Set 5.1 基本操作 5.2 数据结构 6. hyperloglogs 7. geospatial 8. 总结 Redis 系列(02)数据结构 Redis 系列目录 1. String 1.1 基本操作 mset str 2673 jack 666 setnx str incr str incrby str 100 decr str decrby str 100 set f 2.6 incrbyfloat f 7.3 mget str jack strlen str append str good getrange str 0 8 1.2 数据结构 String 字符串类型的内部编码有三种: int,存储8个字节的长整型(long,2^63-1)。 embstr SDS(Simple Dynamic String),存储小于44 个字节的字符串。。 raw SDS,存储大于 44 个字节的字符串。 数据结构示例: 127.0.0.1:6379> set k1

leetcode(数据结构)—— 镜像二叉树

為{幸葍}努か 提交于 2019-12-01 22:30:32
镜像二叉树,力扣上面的的题目,这道题很简单,放出来的原因是它要求用两种解法来写这道题——递归和迭代,而且数据结构学到了树,记录自己学习的过程,以免忘了,没地方找。 题目的意图很明显,就是然你写个程序看看是不是对称的,对称的条件很明显: //左子树点值等于右子树的值 LeftChild->val == RightChild->val   然后我们想一想什么样的树被称为镜像对称? 是不是当一个树的左子树与右子树镜像对称,那么这个树是对称的。那么问题是不是可以转化成:两个树在什么情况下互为镜像?   很明显 当子树相互对称应该符合一下条件:   1、它们的两个根结点具有相同的值。   2、每个树的右子树都与另一个树的左子树镜像对称。 //力扣给的结构体 /** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */ ;现在让我来想想递归如何实现   1、递归就会有终止条件,那么这个函数什么时候表示递归结束呢?     当然是到达树的这一分支的最大深度。那么如何检测递归到了树的这一分支的最大深度,很显然每一棵二叉树,如果它不是根节点,那么,当该节点的左右子树都为空时,表示这树的这一支就兜底了。

数据结构与算法之美---02 如何抓住重点,系统高效地学习?

我的梦境 提交于 2019-12-01 17:06:25
什么是数据结构?什么是算法? 从广义上讲,数据结构就是指一组数据的存储结构。算法就是操作数据的一组方法。 从狭义上讲,是指某些著名的数据结构和算法,比如队列、栈、堆、二分查找、动态规划等。 个人理解:(不知道正确与否) 数据结构是两部分,一个是数据,一个是结构,比如文档讲的图书馆藏书编号,数据是书籍,编号的规律就是结构,合起来就是数据结构。? 数据结构和算法什么关系? 数据结构和算法是相辅相成的。 数据结构是为算法服务的,算法要作用在特定的数据结构之上。 数据结构是静态的,它只是组织数据的一种方式。如果不在它的基础上操作、构建算法,孤立存在的数据结构就是没用的。 个人理解:(不知道正确与否) 不同的数据结构,使用的算法不同。同一数据的不同结构,可能使用的算法也不一样。 重点: 数据结构与算法中最重要的概念—— 复杂度分析 。 数据结构和算法解决的是如何更省、更快地存储和处理数据,考量效率和资源消耗的方法,就是复杂度分析法。 10 个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树; 10 个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法。 掌握数据结构与算法要点:“来历”“自身的特点”“适合解决的问题”以及“实际的应用场景” 学习技巧: 1. 边学边练,适度刷题   建议你每周花 1~2 个小时的时间