数据结构

数据结构:树和森林

偶尔善良 提交于 2020-02-12 12:16:09
树 树是数据结构内很重要的一种结构。不过我们此处不深究,仅讨论二叉树,线索二叉树,哈夫曼树(最优树)。 二叉树 定义: (1)空树;(2)只有一个根节点;(3)有左右两个子树,并且子树也是一颗二叉树(如图)。 性质: 1.第 i 层上最多有 2 i − 1 2^{i-1} 2 i − 1 个节点. 2.深度为k的树最多有 2 k 2^k 2 k -1个节点,我们称之为满二叉树,满二叉树在底层从右向左减少n个节点,此时称为完全二叉树。 3.度为0的结点的个数为度为2的节点个数加一, n 0 = n 2 + 1 n_0=n_2+1 n 0 ​ = n 2 ​ + 1 . 4.n个节点的完全二叉树的深度为[ l o g 2 n log_2n l o g 2 ​ n ]+1。 注释 :[x]表示不超过x的最大整数,也就是向下取整。 5.节点序号为 i ,在子节点存在的情况下,节点的序号为 2i和2i+1 遍历方式 1.先序遍历:先访问根节点,再访问左子树然后是右子树。 2.中序遍历:先访问左子树,再访问根节点然后再右子树。 3.后序遍历:先访问左子树,再访问右子树然后是根节点。 先序中序,后序中序能唯一的确定唯一一个二叉树 还有其他三种遍历方式 : 只需将以上三种方式的左和右换位置即可 存储结构 1.顺序存储结构(由于太浪费内存,所以说一般不用) 2.链式存储结构

sockaddr结构体

淺唱寂寞╮ 提交于 2020-02-12 08:57:05
sockaddr 本词条缺少 名片图 ,补充相关内容使词条更完整,还能快速升级,赶紧来 编辑 吧! 一,用于存储参与(IP)Windows套接字通信的计算机上的一个internet协议(IP)地址。为了统一地址结构的表示方法 ,统一接口函数,使得不同的地址结构可以被bind()、connect()、recvfrom()、sendto()等函数调用。但一般的编程中并不直接对此数据结构进行操作,而使用另一个与之等价的数据结构sockaddr_in。这是由于Microsoft TCP/IP 套接字 开发人员的工具箱仅支持internet地址字段,而实际填充字段的每一部分则遵循sockaddr_in数据结构,两者大小都是16字节,所以二者之间可以进行切换。 外文名 sockaddr 性 质 通用地址结构 定 义 struct sockaddr { 说 明 sa_data : 是14字节的协议地址 目录 1 sockaddr 2 sockaddr_in 1 sockaddr 其定义如下: struct sockaddr {   unsigned short sa_family; /* address family, AF_xxx */   char sa_data[14]; /* 14 bytes of protocol address */   }; 说明: sa_family

mysql索引原理

时光怂恿深爱的人放手 提交于 2020-02-12 04:40:05
为什么要使用索引?使用索引有什么优点和缺点? 使用索引是为了使我们查询变得更快。使用索引如果我们对数据进行修改或者删除那么他的索引也要随之改变,所以使用索引就会降低我们修改删除的效率。 mysql有几种索引类型? 普通索引:这一类索引可以创建在任何数据类型中,没有限制。 唯一索引:创建该类索引时,需要保证创建索引的那一列值是唯一的。 全文索引:全文索引只能创建在CHAR,VARCHAR,TEXT类型的字段上,主要是为了提高查询较大字符串的查询速度,只有MyISAM存储引擎支持 单列索引:在表中给单个列创建索引,单列索引可以是普通索引,唯一索引,全文索引 多列索引:在同一张表的多个列上创建索引 索引为什么会使查询效率大大提高? mysql默认使用的是B+树的数据结构。 索引:排好序的数据结构,类似于书的目录,我们可以通过一本书的目录,快速查找到我们需要的内容,而不需要一页一页的去查看。 mysql索引数据结构为什么要默认使用B+树,而不使用其他的数据结构? 据我了解的数据结构有,二叉树,红黑树,B树,B+树 (他们都有一个共同的特点,就是右边的数据一定都比左边的小) 二叉树: 以上两组数据虽然数字是一样的但是他们的顺序不一样,所以构建出来的二叉树不一样,通过上面这张图可以看出来,如果如果数据是从大到小或者是从小到大的顺序插入,这样会导致二叉树变为链表数据结构,链表查询效率比较慢

PTA数据结构第一次作业

守給你的承諾、 提交于 2020-02-12 02:34:22
7-1 统计学生平均成绩与及格人数 ( 15 分 ) 本题要求编写程序,计算学生们的平均成绩,并统计及格(成绩不低于60分)的人数。题目保证输入与输出均在整型范围内。 输入格式: 输入在第一行中给出非负整数N,即学生人数。第二行给出N个非负整数,即这N位学生的成绩,其间以空格分隔。 输出格式: 按照以下格式输出: average = 成绩均值 count = 及格人数 其中平均值精确到小数点后一位。 输入样例: 5 77 54 92 73 60 输出样例: average = 71.2 count = 4 #include<stdio.h> int main() { int N,ia,count,sum,i; float average; scanf("%d",&N); sum=0; count=0; average=0; for(i=0;i<N;i++) { scanf("%d",&ia); sum=sum+ia; if(ia>=60) { count++; } } if(N==0) { printf("average = 0.0\n"); } else if(N>0) { average=sum/(float)N; printf("average = %.1f\n",average); } printf("count = %d\n",count); return 0; } 7

数据结构之队列(链式存储),实现优先队列

我们两清 提交于 2020-02-12 02:30:56
我们在打王者或者英雄联盟时,游戏中的防御塔总是先打大炮车,打完大炮车再打小兵。这里就用到优先队列,大炮车的优先级高,小兵的优先级低,所有防御塔会优先打大炮车。 优先队列大部分和链式队列一样,只是出队方式和链式队列骚骚有点区别。 不说了,上代码 # include <iostream> # define MAX_SIZE 5 using namespace std ; typedef int DataType ; typedef struct _QNode { int priority ; DataType data ; struct _QNode * next ; } QNode ; typedef QNode * QueuePtr ; typedef struct { int length ; QueuePtr front ; QueuePtr rear ; } LinkQueue ; //初始化 bool initQueue ( LinkQueue * & LQ ) { LQ = new LinkQueue ; if ( ! LQ ) return false ; LQ -> length = 0 ; LQ -> front = LQ -> rear = NULL ; return true ; } //判断是否为空 bool isEmpty ( LinkQueue * &

数据结构与算法

我怕爱的太早我们不能终老 提交于 2020-02-11 19:30:29
1 重要思想: 升维 时间换空间的思想 链表 —> 跳表(增加多级索引) 跳表查询时间:0 ( logn ) 来源: https://www.cnblogs.com/terrycode/p/12295850.html

数据结构(三)之栈结构

一曲冷凌霜 提交于 2020-02-11 16:22:05
如需转载, 请咨询作者, 并且注明出处. 有任何问题, 可以关注我的微博: coderwhy , 或者添加我的微信: 372623326 栈也是一种非常常见的数据结构, 并且在程序中的应用非常广泛. 一. 认识栈结构 我们先来简单认识一下栈结构, 它的特点和应用场景等. 栈结构 数组 我们知道数组是一种线性结构, 并且可以在数组的任意位置插入和删除数据. 但是有时候, 我们为了实现某些功能, 必须对这种任意性加以限制. 而栈和队列就是比较常见的受限的线性结构, 我们先来学习栈结构. 栈(stack),它是一种运算受限的线性表,后进先出(LIFO) LIFO(last in first out)表示就是后进入的元素, 第一个弹出栈空间. 类似于自动餐托盘, 最后放上的托盘, 往往先把拿出去使用. 其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。 向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素; 从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。 生活中类似于栈的 自助餐的托盘, 最新放上去的, 最先被客人拿走使用. 收到很多的邮件(实体的), 从上往下依次处理这些邮件. (最新到的邮件, 最先处理) 注意: 不允许改变邮件的次序, 比如从最小开始,

Javascript算法和数据结构

谁都会走 提交于 2020-02-11 13:12:39
什么是算法和数据结构 数据结构:计算机中存储和组织数据的方式 算法:解决办法的逻辑/操作 数组 JS数组就是API的调用 栈 栈是受限的线性结构:(生活中类似于自助餐的托盘) 只能在一端添加/删除元素 (栈顶) 进入:进栈(压栈) 出去:出栈(退 栈) 函数调用栈 A调用B,B调C,C调D D,C,B,A的弹栈顺序 一个栈结构面试题 有6个元素 6,5,4,3,2,1的顺序进栈(要考虑到可以一边入栈一边出栈) 3,4,6,5,2,1不合法 4.使用数组实现栈 // Method:和某一个对象实例有关系 // function // 封装栈类 // 1.封装栈类 function Stack() { // 栈中的属性 this.items = [] // 栈的相关操作 // 1.将元素压入栈 // function push(this){ // } 这种方法添加方法不好,因为这样每一个new出来的对象都会有一个push实例,占用内存 Stack.prototype.push = function(element) { return this.items.push(element) } // 2.从栈顶中取出元素 Stack.prototype.pop = function() { return this.items.pop() } // 3.返回栈顶元素,仅仅返回 Stack

OI模板合集(数据结构、图论、数论)

跟風遠走 提交于 2020-02-11 00:13:13
本模板合集将持续更新 数据结构 并查集 编写次数:29 int fa[MAX]; int find(int x){ return x==fa[x]?x:fa[x]=find(fa[x]); } inline void merge(int x,int y){ register int a=find(x),b=find(y); if(a!=b)fa[a]=b; } int main(){ for(register int i=1;i<=n;++i)fa[i]=i; return 0; } 树状数组 BIT 编写次数:24 int Arr[MAX]; inline void Add(int x,int v){ while(x<=n){ Arr[x]+=v; x+=(x&-x); } } inline int Query(int x){ register int res=0; while(x){ res+=Arr[x]; x+=(x&-x); } return res; } 线段树 seg 编写次数:25 int tree[MAX<<2],tag[MAX<<2]; inline void pushup(int x){ tree[x]=tree[x<<1]+tree[x<<1|1]; } inline void push_down(int x,int l,int r,int v){ tag