数据结构

数据结构第二章

吃可爱长大的小学妹 提交于 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)

数据结构与算法系列一(开篇)

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

设计模式(23)--Visitor--访问者模式--行为型

流过昼夜 提交于 2020-02-27 09:13:38
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.模式定义:     访问者模式是对象的行为模式。访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变。 2.模式特点:     访问者模式把数据结构和作用于结构上的操作解耦合,使得操作集合可相对自由地演化。访问者模式适用于数据结构相对稳定算法又易变化的系统。因为访问者模式使得算法操作增加变得容易。若系统数据结构对象易于变化,经常有新的数据对象增加进来,则不适合使用访问者模式。 3.使用场景:     (1)数据结构稳定,作用于数据结构的操作经常变化的时候。     (2)当一个数据结构中,一些元素类需要负责与其不相关的操作的时候,为了将这些操作分离出去,以减少这些元素类的职责时,可以使用访问者模式。     (3)有时在对数据结构上的元素进行操作的时候,需要区分具体的类型,这时使用访问者模式可以针对不同的类型,在访问者类中定义不同的操作,从而去除掉类型判断。     (4)假如一个对象中存在着一些与本对象不相干(或者关系较弱)的操作,为了避免这些操作污染这个对象,则可以使用访问者模式来把这些操作封装到访问者中去。     (5)假如一组对象中,存在着相似的操作,为了避免出现大量重复的代码,也可以将这些重复的操作封装到访问者中去。     

(数据结构)散列表

℡╲_俬逩灬. 提交于 2020-02-27 08:39:32
1.概念 3.散列表函数的要求与特点 4、散列表-散列函数的常用设计方法(了解) 5、散列表-散列冲突 6、散列表-散列冲突解决方案(线性探测法) 8、散列表-散列冲突解方案(二次散列) 9、散列表-散列冲突的解决方案(链表法) 10、散列表-应用介绍 jdk1.7的 11、散列表-hash算法-介绍 来源: https://www.cnblogs.com/curedfisher/p/12370324.html

数据结构笔记——双向循环链表示例 约瑟夫环

匆匆过客 提交于 2020-02-27 08:29:58
/* 利用双向链表解决约瑟夫环问题(也可以使用循环链表) 问题描述: 将n个人围成一圈开始报数,每次报到m的人出列,它的下一个 人从1开始重新报数,直到所有玩家出列。 解决思路,使用一个双向循环链表模拟整个游戏成员,每一个节点 代表一玩家。 */ # include <stdio.h> # include <stdlib.h> # include <malloc.h> // 双向链表类型定义 typedef struct NODE { int data; // 数据域 struct NODE * next; // 储存前驱地址 struct NODE * prior; // 储存此节点的后一个节点的地址 }Node, * pNode; // 双向循环链表的创建 pNode Create_DCList(int len); // 在长度为n的双向循环链表上,报数为m的玩家出列 void Josephus(pNode pHead, int n, int m, int k); int main(void) { pNode pHead; int n, k, m; printf("输入玩家个数 n = "); scanf("%d", &n); printf("输入开始报数的序号 k = "); scanf("%d", &k); printf("报数为 m 的人出列 m = "); scanf(

数据结构之栈-c语言实现

非 Y 不嫁゛ 提交于 2020-02-27 07:47:06
文章来源: http://blog.seclibs.com/数据结构之栈-c语言实现/ 在上一篇文章中说过,栈在实现上分为顺序栈和链式栈两种。 顺序栈: 用数组实现的栈 链式栈: 用链表实现的栈 因为栈就是一种“功能受限”的顺序表,所以在实现的时候,在之前数组和链表的基础上进行修改即可达到效果。 顺序栈 在实现顺序栈的时候,为了更好的表示栈顶元素top,我将之前数组中的使用个数used替换为top,在其他方面并没有太大的变化。 需要下载代码请移步至文末。 链式栈 链式栈在原先链表的基础上省去了不少内容,像按位置插入,删除指定内容等,这些都是由于栈的特性决定了只能从一端进行插入和删除,也正是因为如此,所以在单链表的基础上进行修改的,使用双链表没有太大的意义。 需要下载代码请移步至文末。 代码: 顺序栈: GitHub 链式栈: GitHub 文章首发公众号和个人博客 公众号:无心的梦呓(wuxinmengyi) 博客: http://blog.seclibs.com/ 安全库: http://www.seclibs.com/ 来源: oschina 链接: https://my.oschina.net/u/3677719/blog/3162273

数据结构之顺序队列、链式队列、循环队列-c语言实现

左心房为你撑大大i 提交于 2020-02-27 07:21:27
文章来源: http://blog.seclibs.com/数据结构之顺序队列、链式队列、循环队列-c语言实/ 在上一篇文章里,说了队列的相关内容,其中除了这篇文章说的顺序队列、链式队列和循环队列三个,还提到了阻塞队列和并发队列,这两个因为能力原因,还没能实现,这个坑等以后再来补。 回来说这次实现的三个队列,首先是顺序队列,顺序队列是基于数组来实现的队列,在原数组的实现基础上增加了head和tail两个结构体成员,用来标识队头和队尾。 其他的也没有什么太大的变化了,代码如下 如果需要下载代码的,请移步文末 接下来说链式队列,链式队列的实现与之前的实现都有一点区别,因为链表和队列两个都是需要指针的,所以在这里定义两个结构体的时候需要格外的注意一下,在后面的代码实现中也需要着重理解一下其中的含义。 在定义结构体的时候,我使用了typedef struct和struct两种,可以在代码中去感受一下它们的区别所在。 因为其中有链表的存在,所以在出队的时候需要注意将出队元素的内存空间释放掉,其他的也就没有太多了变化了,代码如下 如果需要下载代码,请移步至文末 最后说循环队列,循环队列实现的难易程度与顺序队列相仿,难点在于当队列放满一次时,如何将变量回到0,从新开始走,这里还是用到前一篇文章中确定队列满时的公式,当head增加到最大时,如何返回0,head=(head+1)%size

LoxodonFramework

泪湿孤枕 提交于 2020-02-27 06:49:37
上下文(Context) 它可以说就是与当前代码运行相关的一个环境,你能在上下文中 提供了当前运行需要的环境数据或者服务等 ,( 存储服务的介质 ),上下文中包含服务容器,用来存储与当前环境相关的服务, 比如资源加载服务、网络连接服务、配置文件解析服务等 ; 单例 容器注册服务,通过字典进行存储以 < tpyeof ( class ) , new class ( ) > 的方式,也可以注册方法等信息; 服务 在上下文中注册完服务信息,之后对服务进行初始化 中介者模式 :用一个对象来封装一系列对象的交互,不需要显示的对象之间互相引用,从而使其耦合松散。本文通过消息机制来实现该模式 模块之间可以通过定义好的数据结构通过消息进行调用,彼此之间没有强关联,不需要知道会对谁产生影响,只需要消息中心进行处理,获取数据变化时,只需要更改数据结构即可 来源: CSDN 作者: AresNan 链接: https://blog.csdn.net/AresNan/article/details/104422906

Redis数据结构内部编码

試著忘記壹切 提交于 2020-02-27 06:00:02
整体说明 Redis的每一个键值都是使用一个redisObject结构体保存的: typedef struct redisObject { // 类型 unsigned type:4; // 编码 unsigned encoding:4; // 对象最后一次被访问的时间 unsigned lru:REDIS_LRU_BITS; /* lru time (relative to server.lruclock) */ // 引用计数 int refcount; // 指向实际值的指针 void *ptr; } robj; type字段表示数据类型: /* Object types */ #define REDIS_STRING 0 #define REDIS_LIST 1 #define REDIS_SET 2 #define REDIS_ZSET 3 #define REDIS_HASH 4 encoding表示内部编码方式: #define REDIS_ENCODING_RAW 0 /* Raw representation */ #define REDIS_ENCODING_INT 1 /* Encoded as integer */ #define REDIS_ENCODING_HT 2 /* Encoded as hash table */ #define REDIS

为什么要使用索引?

烂漫一生 提交于 2020-02-27 04:17:38
为什么要使用索引? 什么是索引? MySQL 官方对索引的定义为:索引(Index)是帮助 MySQL 高效获取数据的数据结构。   影响数据库效率的原因千千万万,使用索引是为了解决哪方面的数据库的瓶颈? 点一 MySQL 数据库存储数据最终是以文件的形式存储到硬盘的。一般来说,我们在程序中使用的时候肯定要把磁盘文件中的数据读到内存中。那么就这个 “读” 的过程是什么样子的呢?磁盘读取数据靠的是机械运动,每次读取数据花费的时间可以分为寻道时间、旋转延迟、传输时间三个部分,寻道时间指的是磁臂移动到指定磁道所需要的时间,主流磁盘的寻道时间一般在5ms以下;旋转延迟就是我们经常听说的磁盘转速,比如一个磁盘7200转,表示每分钟能转7200次,也就是说1秒钟能转120次,旋转延迟就是1/120/2 = 4.17ms(旋转延迟等于磁盘转动半圈时间);传输时间指的是从磁盘读出或将数据写入磁盘的时间,一般在零点几毫秒,相对于前两个时间可以忽略不计。那么访问一次磁盘的时间,即一次磁盘IO的时间约等于5+4.17 = 9ms左右,听起来还挺不错的,但要知道一台 500 - MIPS 的机器每秒可以执行5亿条指令,因为指令依靠的是电的性质,换句话说执行一次IO的时间可以执行40万条指令(如果以 CPU 的指令执行效率来比较的话),数据库动辄十万百万乃至千万级数据,每次9毫秒的时间,显然是个灾难