
Data structure
WilliamCode
这个作者很懒,什么都没留下…
展开
-
算法与数据结构【Java实现】:二叉查找树
链表能够很方便的存储数据,但是,数据的组织只能是线性的,不能有层次的组织数据,且查找元素需要线性查找,复杂度O(n)。 二叉查找树是一种按照排序组织数据的有层次的方式它的特点是:(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;即:对于任何一个子树,左子树所有结点值小于根...原创 2020-02-13 21:40:17 · 417 阅读 · 0 评论 -
算法与数据结构【C++与Java实现】:链表篇
对于大多数应用而言,存储数据最好的方式就是使用表。表有两种最常用的实现:数组和链表数组是在内存中连续存在的结构,且编译器就需要直到其大小。对于无法提前预估数据规模的程序,如果初始的数组太小,则需要扩展数组大小,这常常伴随着大量的内存复制,时间复杂度很高;如果初始的数组太大,则会造成很大的内存资源浪费。链表也是一种连续的数据结构,与数组的不同是,每一个元素在内存中不一定连续存储,元素与元...原创 2020-01-27 21:37:06 · 1692 阅读 · 0 评论 -
算法与数据结构【C++】:稀疏表
很多情境下,存储数据的最好方式就是表。当数据较为稠密的聚集在某个坐标范围中时,采用数组是最好的选择。比如,要存储一个班学生的成绩,该班级有30人,编号从1-30,有10门课,编号1-10那么就可以用一个30x10的数组存储这张成绩表,经济实惠使用方便但是有的时候数据非常稀疏,比如一个学校一共开设了1000门课,有的学生可以随意选课,现在需要一个数据结构存储每个学生每门课的成绩。显...原创 2020-01-27 21:27:54 · 699 阅读 · 0 评论 -
算法与数据结构【Java】:稀疏表
很多情境下,存储数据的最好方式就是表。当数据较为稠密的聚集在某个坐标范围中时,采用数组是最好的选择。比如,要存储一个班学生的成绩,该班级有30人,编号从1-30,有10门课,编号1-10那么就可以用一个30x10的数组存储这张成绩表,经济实惠使用方便但是有的时候数据非常稀疏,比如一个学校一共开设了1000门课,有的学生可以随意选课,现在需要一个数据结构存储每个学生每门课的成绩。显...原创 2020-01-27 21:27:40 · 531 阅读 · 0 评论 -
算法与数据结构【Java】:跳跃链表
普通链表有一个严重的缺陷:查找某对象时需要遍历整个链表,直到找到了该元素或者遍历完了整个链表也没有找到,时间复杂度很高。 为了解决该问题,可以使用跳跃链表。跳跃链表的特点:跳跃链表中的元素按照从小到达或从大到小的规则排列,该顺序在向链表加入元素时维护,所以,只能指定向链表插入某个值,不能指定插入位置跳跃链表使用了二分查找的思想, 查找某个元素的复杂度是O(logn)...原创 2020-01-26 16:20:43 · 549 阅读 · 0 评论 -
算法与数据结构【C++】:跳跃链表
普通链表有一个严重的缺陷:查找某对象时需要遍历整个链表,直到找到了该元素或者遍历完了整个链表也没有找到,时间复杂度很高。 为了解决该问题,可以使用跳跃链表。跳跃链表的特点:跳跃链表中的元素按照从小到达或从大到小的规则排列,该顺序在向链表加入元素时维护,所以,只能指定向链表插入某个值,不能指定插入位置跳跃链表使用了二分查找的思想, 查找某个元素的复杂度...原创 2020-01-26 16:19:38 · 434 阅读 · 0 评论 -
算法与数据结构【Java】:自组织链表
由于链表中,在某一时间段内每个元素使用的频率不同,所以,依赖于这种特点,产生了自组织链表,来提高链表的查找效率。自组织链表可以动态的组织链表,有很多种方法,这里列举4种: 1、前移法:找到需要的元素之后,将它放到链表开头 2、换位法:找到需要的元素之后,将它和前驱交换位置 3、计数法:在结点中记录被访问的次数,根据被访问的次数,对链表进行排序 4、排序法:根据链表...原创 2020-01-26 16:16:00 · 255 阅读 · 0 评论 -
算法与数据结构【C++】:自组织链表
自组织链表由于链表中,在某一时间段内每个元素使用的频率不同,所以,依赖于这种特点,产生了自组织链表,来提高链表的查找效率。自组织链表可以动态的组织链表,有很多种方法,这里列举4种: 1、前移法:找到需要的元素之后,将它放到链表开头 2、换位法:找到需要的元素之后,将它和前驱交换位置 3、计数法:在结点中记录被访问的次数,根据被访问的次数,对链表进行排序 4、排...原创 2020-01-26 16:15:15 · 627 阅读 · 0 评论 -
算法与数据结构【Java】:循环链表
1、定义:循环链表是一种首尾相接的链表,其本身并没有首尾,但是为了给链表提供入口,方便对链表进行操作,所以定义了“头”和“尾”2、循环链表可以在单向链表上通过简单的增改来实现,但是这里单独实现了循环链表。3、循环链表的用处举例:操作系统任务调度时,相同优先级的任务会获得相同时间的CPU使用权,在一个任务占用CPU结束后,需要将CPU让给下一个任务,如此循环,可以用到循环链表。下方是Java...原创 2020-01-26 16:13:48 · 251 阅读 · 0 评论 -
算法与数据结构【C++】:循环链表
1、定义:循环链表是一种首尾相接的链表,其本身并没有首尾,但是为了给链表提供入口,方便对链表进行操作,所以定义了“头”和“尾”2、循环链表可以在单向链表上通过简单的增改来实现,但是这里单独实现了循环链表。3、循环链表的用处举例:操作系统任务调度时,相同优先级的任务会获得相同时间的CPU使用权,在一个任务占用CPU结束后,需要将CPU让给下一个任务,如此循环,可以用到循环链表。下方是C...原创 2020-01-26 16:11:54 · 1754 阅读 · 0 评论 -
算法与数据结构【Java】:双向链表
双向链表相对于单向链表的优点: 1、单向链表在需要对列表尾部进行操作时,需要通过遍历的方式获取尾部的结点,很浪费时间 2、对于需要频繁使用deleteFromTail()和addToTail()方法的程序,程序效率会非常低 3、双向链表存储了每个结点前面的结点,在对尾部进行操作时,能非常方便的获取尾部的结点信息,方便对尾部进行操作,大大提高了程序效率 4、但是,...原创 2020-01-26 16:10:49 · 293 阅读 · 0 评论 -
算法与数据结构【C++】:双向链表
双向链表相对于单向链表的优点: 1、单向链表在需要对列表尾部进行操作时,需要通过遍历的方式获取尾部的结点,很浪费时间 2、对于需要频繁使用deleteFromTail()和addToTail()方法的程序,程序效率会非常低 3、双向链表存储了每个结点前面的结点,在对尾部进行操作时,能非常方便的获取尾部的结点信息,方便对尾部进行操作,大大提高了程序效率 4、但是,...原创 2020-01-26 16:09:37 · 338 阅读 · 0 评论 -
算法与数据结构【Java】:普通单向链表
普通单向链表应该包含的数据和方法:结点类(Node): 属性: AnyType value; //任意类型的数据 Node* next; //指向下一个节点的指针 方法: 构造方法 Node(AnyType* value, Node* next);链表类(LinkedList): Node*...原创 2020-01-26 16:07:54 · 272 阅读 · 0 评论 -
算法与数据结构【C++】:普通单向链表
普通单向链表应该包含的数据和方法:结点类(Node): 属性: AnyType value; //任意类型的数据 Node* next; //指向下一个节点的指针 方法: 构造方法 Node(AnyType* value, Node* next);链表类(LinkedList): Node*...原创 2020-01-26 16:06:41 · 309 阅读 · 0 评论 -
Linux学习笔记(算法与数据结构)之 环状链表(C语言)
1、这是一道数据结构与算法课程的练习题,题目如下:给定一个数n,建立一个有n个节点的环状链表,第i个节点中存储整数i;给定数start(1<= start <=n)和num,要求从start这个节点开始,每隔num个节点删除一个节点,直到链表为空。举例:n = 10,start = 2, num = 3则首先建立环状表,共10个节点,存储整数1、2、3、4、5、6、7、8、9、...原创 2018-10-18 23:27:20 · 236 阅读 · 0 评论 -
Linux学习笔记(算法与数据结构)之 二叉搜索树代码(C语言)
1、代码在VS2010的C++编译器中编译通过,可能有极少部分语法不符合C99标准;bool类型无法使用,用int代替2、由于VS配置问题,没有分.c和.h文件书写;如果要分,最好将Create_Node和Destory_Node加上static关键字修饰,他们只会在所属的.c文件中使用。3、用C实现需要用到二级指针...比较繁琐,C++中可以用引用代替。4、国庆放假了,等会赶火车回家...原创 2018-10-01 17:54:04 · 321 阅读 · 0 评论 -
Linux学习笔记(算法与数据结构)之 队列代码(C语言)
1、代码在VS2010的C++编译器中编译通过,可能有极少部分语法不符合C89标准;bool类型无法使用,用int代替2、由于VS配置问题,没有分.c和.h文件书写;如果要分,最好将Create_Node和Destory_Node加上static关键字修饰,他们只会在所属的.c文件中使用。3、英文注释...// Cpp_Study.cpp : 定义控制台应用程序的入口点。#incl...原创 2018-10-01 12:16:45 · 323 阅读 · 0 评论 -
Linux学习笔记(算法与数据结构)之 堆栈代码(基于链表实现)
1、基于链表实现的堆栈代码,内存动态分配;相对于数组的实现方式,内存使用方式更加灵活,同时,程序不用为堆栈开辟连续的内存空间,所以可能省去一些内存拷贝的时间。2、在VS2010的C++编译器中编译通过。由于VS配置问题,不能使用bool类型,用int代替;也没有分.c和.h文件书写;如果要分开书写,最好给Create_Node和Stack_Node_Destory加上static关键字,该函数...原创 2018-10-01 00:05:06 · 259 阅读 · 0 评论 -
Linux学习笔记(算法与数据结构)之 堆栈代码(基于数组实现)
1、代码在VS2010下编译通过,注释写的较为清楚。2、基于数组实现,还有另一种更加合理的方式即链表实现,代码在我的下一篇博文中。3、因为VS2010配置出了一点问题,因此没有写不同的.h和.c文件 需要时可以分文件,stdlib.h中包含了malloc函数,只需要在堆栈的函数定义代码中包含// Cpp_Study.cpp : 定义控制台应用程序的入口点。#inclu...原创 2018-09-30 22:10:31 · 205 阅读 · 0 评论