数据结构

互评:数据结构、算法及线性表总结

依然范特西╮ 提交于 2020-03-28 17:46:30
一.思维导图 二 . 重要概念的笔记 1.循环队列 front=(front+1)%maxsize rear=(rear+1)%maxsize; 队列元素个数=(front-rear+maxsize)%maxsize; 2.随机存储取元素地址 position=a[0]+(i-1)*sizeof(Elementype); 3.递归算法时间复杂度 思路:列出T(k)的函数 例1 int fact(int n) { if(n<=1) return 1; else return n*fact(n-1); } T(k)=1 当k=1 T(k)=1+T(k-1) 当 k≠1 则: T(n)=1+T(n-1) =1+1+T(n-2) =1+1+....+T(1) =n =O(n) 例2 void mergesort(int a[],int i,int j){ int m; m=(i+j)/2; if(i!=j){ mergesort(a,i,m); mergesort(a,m+1,j); merge(a,i,j,m); } } o(nlg2n) T(k)=O(1) 当k=1 T(k)=2T(k/2)+O(k) 当 k≠1 T(N)=2T(N/2)+N=2(2T((n/4)+N/2)+N=......=2^k(T(n/2^K))+kn 当N=2^k 即k=log2 n T(N)=n+nlog2n

数据结构中顺序表与链表的性能方面比较

会有一股神秘感。 提交于 2020-03-28 06:59:21
一,时间性能的比较 顺序表由数组实现,是一种随机存取结构,对表中任意节点存取操作时间复杂度为O(1)。 而查找链表的节点,须从头指针开始沿链扫描,平均时间复杂度为O(N).因此,若线性表的操作主要是查找,很少进行插入或删除操作,采用顺序比较合适。 对于链表,对某个节点进行插入删除操作只需修改指针,无需大量移动元素,平均时间复杂度为O(1)。而顺序表在插入或删除时,需要大量移动数据元素,平均移动元素的数目为表长的一般,时间复杂度为O(N)。因此,对线性表频繁的进行插入删除操作时,应采用链表。当插入和删除主要在表头或表尾时,应采用循环链表。 表1:时间性能比较 时间复杂度 查找 插入或删除 顺序表 O(1) O(N) 链表 O(N) O(1) 二,空间性能的比较 1, 顺序表的存储空间是静态分配的,必须提前确定其内存大小。常用于存储规模容易确定的线性表。 2, 动态链表的存储空间是动态分配的,只要其内存空间有空闲就不会出现溢出。常用于长度变化较大或长度难以估计的线性表。 3, 定义:存储密度=(节点中数据域占用的空间)/(节点结构占用的存储空间) 有时需考虑存储密度。 综上,在选取线性表时,应综合考虑时间和空间因素,选择一中最适合的。一般而言,顺序表适用于查询,而链表则更便于插入删除管理。 来源: https://www.cnblogs.com/waiting-for/p

数据结构--线性表之顺序表

假装没事ソ 提交于 2020-03-28 06:53:13
一、引入问题 在程序中,经常需要将一组(通常是同为某个类型的)数据元素作为整体管理和使用,需要创建这种元素组,用变量记录它们,传进传出函数等。一组数据中包含的元素个数可能发生变化(可以增加或删除元素)。 对于这种需求,最简单的解决方案便是将这样一组元素看成一个序列,用元素在序列里的位置和顺序,表示实际应用中的某种有意义的信息,或者表示数据之间的某种关系。 这样的一组序列元素的组织形式,我们可以将其抽象为 线性表 。一个线性表是某类元素的一个集合,还记录着元素之间的一种顺序关系。线性表是最基本的数据结构之一。 二、顺序表概念 将元素顺序地存放在一块连续的存储区里,元素间的顺序关系由它们的存储顺序自然表示 三、顺序表的基本形式 1、顺序表的基本形式: 数据元素本身连续存储,每个元素所占的存储单元大小固定相同,元素的下标是其逻辑地址,而元素存储的物理地址(实际内存地址)可以通过存储区的起始地址Loc (e0)加上逻辑地址(第i个元素)与存储单元大小(c)的乘积计算而得,即:         Loc(ei) = Loc(e0) + c*i 故,访问指定元素时无需从头遍历,通过计算便可获得对应地址,其时间复杂度为O(1)。 2、顺序表的元素外置形式: 如果元素的大小不统一,则须采用图b的元素外置的形式,将实际数据元素另行存储,而顺序表中各单元位置保存对应元素的地址信息(即链接)

校招准备-数据结构与算法

落爺英雄遲暮 提交于 2020-03-28 06:29:54
校招中最基础的一环,笔试与白板撸算法 CS中最基本的能力,这方面的准备十分必要,但是准备过程必定十分痛苦 虽常言道水滴石穿,但是多少小河小溪在石穿之前干涸! ----------------------------------- 每天2-3道算法题,完不成就晚上加班 ----------------------------------- 一次总计花一个小时时间学习: 1.找到对应知识点,梳理一遍,弄清楚难点 2.刷15-20分钟小题,来检测自己这块的掌握情况 3.刷20-30分钟对应的算法题 ---------------------------------------------- 结合算法导论,啊哈算法,王道数据结构等书籍; 数据结构(结合c,java与python语言) 1-线性表:链表的各种操作( 双链表的插入,删除 手写 );java中的应用; (6.7 链表,牛客做题) 关于删除链表节点:先解决当前节点后面的,再解决前面的 栈:定义,基本操作(初始化,判断为空,进栈,出栈,读栈顶元素,),顺序栈和链栈;应用 1-队列:定义,基本操作(初始化,判断为空,入队,出队,),顺序存储和链式存储,双端队列;应用 数组与矩阵:数组的各种基本操作,矩阵的压缩存储 1-字符串:字符串的基本操作与实现 堆:定义与基本操作,应用 1-树:二叉树的定义,基本性质,顺序存储,链式存储

Redis对象和Redis数据结构

你说的曾经没有我的故事 提交于 2020-03-27 11:17:37
Redis第一部分 建议已经有这部分知识的人看 用来查漏补缺 我会迭代更新 Redis对象 首先key value,key是固定的字符串对象,value可以是那5种中的一种,而那5种根据场景的不同,每种都有至少两种编码方式,也就是数据结构 数据结构有linkedlist 双端链表 ziplist压缩列表 这个用的太多了 以至于我有深刻的印象 skiplist 跳跃表 类似于平衡树的作用 但是实现方式太友好了 raw 都是sds simply dynamic string embstr 都是sds simply dynamic string 区别是这个更短喽 压缩过的 是连续的内存 所以速度比raw的快 hashtable 两个表嘛ht[0]和ht[1] 嗯 冲突就是在同一个哈希值组成链表 然后有一个负载因子 默认好像是1 进行rehash 然后rehasn的话会在另外一个大于当前数量number的最小的2的n次方那么大的扩容 扩容期间 服务器空闲就转移 当然 新插入的都是在这个新表里 hashtable数组ht[1] 然后全部拷到ht[1]后 就会把ht[0]换成ht[1] 然后h[1]又变成空 linledlist 就是一个简单的双链表 intset int_8 int_16 int_32 int_64 会保存编码方式 一旦有东西需要往上提 比如从int_32到int_64了

C/C++ 数据结构之算法(面试)

独自空忆成欢 提交于 2020-03-27 08:16:46
数据结构中的排序算法。 排序算法的相关知识: (1)排序的概念:所谓排序就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来。 (2)稳定的排序方法:在待排序的文件中,若存在多个关键字相同的记录,经过排序后这些具有相同关键字的记录之间的相对次序保持不变,该排序方法是稳定的。相反,如果发生改变,这种排序方法不稳定。 (3)排序算法的分类(分为5类):插入排序、选择排序、交换排序、归并排序和分配排序。 (4)排序算法两个基本操作:<1>比较关键字的大小。 <2>改变指向记录的指针或移动记录本身。 具体的排序方法: 插入排序 <1>插入排序(Insertion Sort)的思想:每次将一个待排序的记录按其关键字大小插入到前面已经排好序的子记录中的适当位置,直到全部记录插入完成为止。 <2>常用的插入排序方法有直接插入排序和希尔排序。 (1)直接插入排序 <1>算法思路:把一个记录集(如一个数组)分成两部分,前半部分是有序区,后半部分是无序区;有序区一开始有一个元素r[0],无序区一开始是从r[1]到之后的所有元素;然后每次从无序区按顺序取一个元素r[i],拿到有序区中由后往前进行比较,每次比较时,有序区中比r[i]大的元素就往后移动一位,直到找到小于r[i]的元素,这时r[i]插到小元素的后面,则完成一趟直接插入排序。如此反复,从无序区不断取元素插入到有序区,直到无序区为空

ES6:不同数据结构的遍历方法

扶醉桌前 提交于 2020-03-27 05:31:15
ES6对数组,对象都有不同的遍历方法,以下内容均摘自阮一峰的《ES6标准入门》 一、数组的遍历 除了原生js的forEach()遍历方法外,ES6 提供三个新的方法—— entries() , keys() 和 values() ——用于遍历数组。可以用 for...of 循环进行遍历,唯一的区别是 keys() 是对键名的遍历、 values() 是对键值的遍历, entries() 是对键值对的遍历。 for (let index of ['a', 'b'].keys()) { console.log(index); } // 0 // 1 for (let elem of ['a', 'b'].values()) { console.log(elem); } // 'a' // 'b' for (let [index, elem] of ['a', 'b'].entries()) { console.log(index, elem); } // 0 "a" // 1 "b"entries()、keys()、values()会将空位处理成undefined。 二、对象的遍历 ES6 一共有5种方法可以遍历对象的属性。 (1)for...in for...in 循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性)。 (2)Object.keys(obj) Object

redis中的数据结构和编码

≡放荡痞女 提交于 2020-03-27 02:14:36
3 月,跳不动了?>>> redis中的数据结构和编码: 背景: 1>redis在内部使用redisObject结构体来定义存储的值对象。 2>每种类型都有至少两种内部编码,Redis会根据当前值的类型和长度来决定使用哪种编码实现。 3>编码类型转换在Redis写入数据时自动完成,这个转换过程是不可逆的,转换规则只能从小内存编码向大内存编码转换。 源码: 值对象redisObject: typedef struct redisObject { unsigned type:4; /* 对象类型 */ unsigned encoding:4; /* 内部编码 */ unsigned lru:LRU_BITS; /* lru time (relative to server.lruclock) */ int refcount; /* 引用计数器,内存回收机制就是基于该值实现的 */ void *ptr; /* 若要存储的是整数值则直接存储数据,否则表示指向数据的指针 */ } robj; 类型type: 说明:查看当前键的类型:type key #define OBJ_STRING 0 /*字符串对象*/ #define OBJ_LIST 1 /*列表对象*/ #define OBJ_SET 2 /*集合对象*/ #define OBJ_ZSET 3 /*有序集合对象*/ #define

OS填空题练习

不羁岁月 提交于 2020-03-26 06:57:13
1、操作系统的基本特征: 并发性 ; 共享性 ; 虚拟性 ; 异步性 。 2、操作系统的设计目标: 方便性 ; 有效性 ; 可扩充性 ; 开放性 。 3、操作系统的主要功能: 处理机管理 ; 存储器管理 ; 设备管理 ; 文件管理 ; 用户接口 。 4、操作系统的用户接口: 命令接口 ; 程序接口 ; 图形用户接口 。 5、操作系统的基本类型: 批处理系统 ; 分时系统 ; 实时系统 。 6、目前比较流行的操作系统(实例): Windows ; UNIX ; Linux 。 7、 UNIX 系统的内核结构可分成两大部分: 进程控制子系统 ; 文件子系统 。 8、UNIX系统最本质的特征(英文缩写): OSI 。 9、 方便性 和 有效性 是操作系统设计中最重要的两个目标。 10、在OS的基本特征中, 异步性 是指进程是以人们不可预知的速度向前推进的。 11、在操作系统接口中, 程序接口 亦称为 系统调用。 12、在操作系统基本类型中, 可靠性 是 实时系统 最重要的特征。 13、1990年后, 开放性 已成为新系统或软件能否被广泛应用的至关重要的因素。 14、 并发性 是多用户、多任务操作系统最重要的特征。 15、 并发性 和 共享性 是多用户、多任务操作系统两个最基本的特征。 16、在操作系统中,实现进程同步的机制: 信号量机制 ; 管程机制 。 17、同步机制准则中, 让权等待

数据结构与算法(6)——栈Stack

我们两清 提交于 2020-03-26 02:29:11
基础定义 什么是栈: 栈是一种有次序的数据项集合。在栈中,数据项的加入和移除都仅仅发生在同一端,这一端叫栈顶(top),没有操作的另一端叫栈底(base)。 特性: 后进先出,先进后出 栈的基本操作 这里需要知道在python里面是没有栈的,但是我们可以模拟一个栈。 首先我们需要定义的一些栈的基本操作: Stack() 创建一个空栈,不包含任何数据项 push(item) 将item加入栈顶,无返回值 pop() 将栈顶数据项移除,并返回,栈被修改 peek() 查看栈顶数据项,返回栈顶数据项但不移除,且不修改栈 isEmpty() 返回栈是否为空 size() 返回栈中有多少个数据项 这里,我们可以用list类型实现一个栈的操作: 1 class Stack: 2 ''' 3 自己定义的一个栈 4   栈顶是尾端,也可以将栈顶设为尾端 5 ''' 6 def __init__(self): 7 self.items =[] 8 def isEmpty(self): 9 return self.items==[] 10 def push(self,item): 11 self.items.append(item) 12 def pop(self): 13 self.items.pop() 14 def peek(self): 15 return self.items[len