链表

基于锁的并发数据结构

笑着哭i 提交于 2020-03-29 04:04:55
1. 使用细粒度锁和条件变量的线程安全队列 可以使用细粒度的锁来减小队列的临界区,这里使用了一个dummy node用来进一步减小锁的临界区。若要判断队列是否为空,只需要执行下述判断: head.get() == get_tail() 请注意,因为在进行push的时候需要修改tail,所以对tail的访问和修改都需要进行加锁。这里使用get_tail来封装这个操作,将锁的粒度减小到最低。 // lock tail mutex and return tail node node *get_tail() { std::lock_guard<std::mutex> tail_lock(tail_mutex); return tail; } 对push的操作只涉及到修改tail节点,所以只需要对tail节点进行加锁。加锁完成之后就可以修改tail使其指向新的tail节点。 void push(T new_value) { std::shared_ptr<T> new_data(std::make_shared<T>(std::move(new_value))); std::unique_ptr<node> p(new node); { std::lock_guard<std::mutex> tail_lock(tail_mutex); tail->data = new_data; node

redis 基本命令

╄→гoц情女王★ 提交于 2020-03-29 02:19:04
一、key pattern 查询相应的key   (1)redis允许模糊查询key  有3个通配符 *、?、[]   (2)randomkey:返回随机key     (3)type key:返回key存储的类型   (4)exists key:判断某个key是否存在   (5)del key:删除key   (6)rename key newkey:改名   (7)renamenx key newkey:如果newkey不存在则修改成功   (8)move key 1:将key移动到1数据库   (9)ttl key:查询key的生命周期(秒)   (10)expire key 整数值:设置key的生命周期以秒为单位   (11)pexpire key 整数值:设置key的生命周期以毫秒为单位   (12)pttl key:查询key 的生命周期(毫秒)   (13)perisist key:把指定key设置为永久有效 二、字符串类型的操作   (1)set key value [ex 秒数] [px 毫秒数] [nx/xx]         如果ex和px同时写,则以后面的有效期为准       nx:如果key不存在则建立       xx:如果key存在则修改其值   (2)get key:取值   (3)mset key1 value1 key2 value2

数据结构,算法及线性表总结

て烟熏妆下的殇ゞ 提交于 2020-03-28 20:44:20
1.思维导图 2.重要概念笔记 1.数据结构 1.数据结构定义 -我们如何把现实中大量而复杂的问题以特定的数据类型和特定的存储结构保存到主存储器(内存)中,以及在此基础上为实现某个功能(比如查找某个元素,删除某个元素,对元素进行排序等)而执行的相应操作,这个相应的操作也叫算法。 2.算法 -衡量算法的标准: -时间复杂度:程序大概要执行的次数,而非执行的时间 -空间复杂度:程序执行过程中大概所占用的最大内存空间 -难易程度:用易懂,避免过于复杂 -健壮性 3.连续存储【数组】 -什么叫数组:元素类型相同,大小相等 -数组的优缺点 --优点:存取速度很快 --缺点:插入删除元素很慢 4.离散结构【链表】 -定义:n个节点离散分配,彼此通过指针相连,每个节点只有一个前驱节点同时每个节点只有一个后续节点,首节点没有前驱节点,尾节点没有后续节点 -专业术语 --首节点:存放第一个有效数据的节点 --尾节点:存放最后一个有效数据的节点 --头结点:位于首节点之前的一个节点,头结点并不存放有效的数据,加头结点的目的主要是为了方便对链表的操作 --头指针:指向头结点的指针变量 --尾指针:指向尾节点的指针变量 -确定一个链表需要几个参数:只需要一个头指针参数,因为我们通过头指针可以推算出链表的其他所有信息 -分类: --单链表:每一个节点只有一个指针域 --双链表:每一个节点有两个指针域 -

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

℡╲_俬逩灬. 提交于 2020-03-28 19:23:14
··· //初始化表 void InitList(SqList *&L) { L=new SqList;//为线性表分配空间 L->length=0; } //销毁线性表 void DestoryList(SqList* &L) { delete L;//释放L指向的内存空间 } //获取元素 bool GetElem(SqList *L,int i,ElemType &e) { if(i<1||i>L->length) return false; e=L->data[i-1]; return true; } //插入元素 bool ListInsert(SqList *&L,int i,ElemType e) { if(i<1||i>L->length) return false; i--; for(int j=L->length;j>i;j--) L->data[j] = L->data[j-1]; L->data[i]=e; L->length++; return true; } //删除元素 bool LiseDelete(SqList *&L,int i,ElemType &e) { if(i<1||i>L->length) return false; i--; e=L->datd[i]; for(int j=i;j<L->length-1;j++) L->data[j]

数据结构-概念总结

大城市里の小女人 提交于 2020-03-28 19:14:48
数据结构概念总结 Data Structures + Algorithms = Programs 一.数据结构 1.基本概念: 数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合 2.数据结构的逻辑结构分为四种: 集合结构,线性结构,树形结构,图结构。 3.数据结构的物理结构分为两种: 顺序存储结构和链式存储结构. 4.学习数据结构的用途: 数据结构在计算机专业课程体系中起到承上启下的作业,熟练使用数据结构可以使程序运行的更快更流畅 思维导图: 二.算法 1.定义: 对特定问题求解步骤的一种描述,它是指令的特定序列,每一条指令表示一个或多个操作 2.特性: 有穷性,确定性,可行性,输入,输出。 3.算法的描述: 自然语言,流程图,程序设计语言,伪代码。 4.算法分析: (1)算法设计的目标: 正确性,可使用性,可读性,健壮性,时间效率高与存储量低 (2)两种衡量算法效率的方法: 事后统计法(把程序跑一遍): 必须执行程序,且存在其他因素掩盖算法本质 事前估计法(撇开软硬件相关因素,仅考虑算法本身效率): 算法执行时间=基本运算时间*运算次数 基本运算:被视为算术运算的一般是最深层循环内语句 (3)算法效率分析: 算法的执行时间可由其基本运算的执行次数来计算 时间复杂度:记号"O",表示随问题规模n增大,算法执行时间的增长率和f(n

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

独自空忆成欢 提交于 2020-03-28 19:09:16
数据结构、算法及线性表总结 本学期学习了数据结构这门课,为了能够理清学习历程,在此记录学习到的知识,以供参考。 一、本课程的思维导图(持续更新) 二、重要概念的笔记及个人解析 <font color=>第一章:绪论 1)数据结构的定义:数据结构是指所有数据元素以及数据元素之间的关系,可以看作是相互之间存在着某种特定关系的数据元素的集合 (带结构的数据的集合) 2)逻辑结构的定义:逻辑结构是从数据元素的逻辑关系上描述数据的,它与数据的存储无关,是从具体问题中抽象出来的数学模型。 (用来描述数据之间有怎样的关系,或哪种类型的关系) 3)逻辑结构的类型:逻辑结构是多样复杂的,现阶段我们接触到的有 集合 、 线性结构 、 树形结构 以及 图形结构 。(目前学习到线性结构) 4)存储结构的定义:存储结构是数据元素及其关系在计算机存储器中的存储表示也称为物理结构,常用的有 顺序存储 、 链式存储 、 索引存储 和 哈希存储 四中存储结构。 5)顺序存储结构:用该结构存储数据元素,所有数据元素在存储器中占有一整块存储空间, 可将逻辑结构直接映射到存储结构 。(优点:存储效率高,没有额外占用的空间,还可以实现对元素的随机存取。缺点:不便于数据修改,一个元素的变动就可能使其他一系列元素也要进行移动) 6)链式存储结构:每一个数据元素占用的只是一个内存节点,每个节点单独分配,地址也不一定连续

链表

杀马特。学长 韩版系。学妹 提交于 2020-03-28 12:38:46
指针的作用用来存储地址 int a; int *p; 定义一个存储整型变量的地址的指针 p=&a; 保存a的地址; pritnf("%d," *p); 输出p存储地址的值 *的作用{1.表乘法 2.申明一个指针,在定义指针变量时使用 3.间接运算符,取得指针所指向的内存中的值} #include<iostream> #include<cstdlib> using namespace std; struct node{ int date; struct node *next; }; int main(){ int n,date,number; struct node *head,*q,*p,*t; head=NULL; cin>>n; for(int i=1;i<=n;i++){ cin>>date; p=(struct node *)malloc(sizeof(struct node)); p->date=date; p->next=NULL; if(head == NULL){ head=p; }else{ q->next=p; } q=p; } t=head; while(t!=NULL){ cout<<t->date<<' '; t=t->next; } //Insert a number cin>>number; t=head; while(t!=NULL){ if(t-

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

会有一股神秘感。 提交于 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

K:顺序表和链表的比较

烂漫一生 提交于 2020-03-28 06:55:41
 顺序表和链表是线性表的两种基本实现形式(链表还有多种变化形式),对于这两种实现方式,没有一种方法可以称是最好的,他们各自有着各自的特点和优缺点,适用于不同的应用场景。  与顺序表相比,链表较为灵活,它既不要求在预先分配的一块连续的存储空间中存储线性表的所有数据元素,也不要求按其逻辑顺序来分配存储单元,可根据需要进行存储空间的动态分配。因此,当线性表的长度变化较大或长度难以估计时,宜用链表。但在线性表的长度基本可以预计且变化较小的情况下,宜用顺序表,因为链表的存储密度较顺序表的低,且顺序表具有随机存取的优势。  在顺序表中按序号访问第i个数据元素时的时间复杂度为O(1),而在链表中做同样操作的时间复杂度为O(n)。所以,若要经常对线性表按序号范文数据元素时,顺序表要优先于链表;但在顺序表上做插入和删除操作时,需要平均移动一般的数据元素,而在链表上做插入和删除操作时,不需要移动任何数据元素,虽然要查找插入或删除数据元素的位置,但由于主要是比较操作,所以总体而言,链表要优先于顺序表。  总之,链表比较灵活,插入和删除操作的效率较高,但链表的空间利用率较低,适用于实现动态的线性表;顺序表实现比较简单,因为在任何高级程序语言中都有数组类型,并且空间利用率也较高,可高效的进行随机存取,但顺序表不易扩充,插入和删除操作的效率较低,适合于实现相对“稳定”的静态线性表。 回到目录|·(工)·)

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

落爺英雄遲暮 提交于 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-树:二叉树的定义,基本性质,顺序存储,链式存储