数据结构是计算机存储、组织数据的方式;通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构的优良将直接影响着我们程序的性能;常用的数据结构有:数组(Array)、栈(Stack)、队列(Queue)、链表(Linked List)、树(Tree)、图(Graph)、堆(Heap)、散列表(Hash)等;
集合:数据结构中的元素之间除了“同属一个集合” 的相互关系外,别无其他关系;
线性结构:数据结构中的元素存在一对一的相互关系;
树形结构:数据结构中的元素存在一对多的相互关系;
图形结构:数据结构中的元素存在多对多的相互关系;
数据结构按逻辑上划分为线性结构与非线性结构;
典型的线性表有:链表、栈和队列。它们共同的特点就是数据之间的线性关系,除了头结点和尾结点之外,每个结点都有唯一的前驱和唯一的后继,也就是所谓的一对一的关系。
数组(Array):数组是有序元素的序列,在内存中的分配是连续的,数组会为存储的元素都分配一个下标(索引),此下标是一个自增连续的,访问数组中的元素通过下标进行访问;数组下标从0开始访问;
数组的优点是:查询速度快;
新增一个元素40到3索引下标位置:
删除2索引元素:
总结:数组查询快,增删慢,适用于频繁查询,增删较少的情况;
链表的节点(Node):
完整的链表:
在链表中新增一个元素:
在单向链表中,新增一个元素最多只会影响上一个节点,比在数组中的新增效率要高的多;
在链表中删除一个元素:
总结:数据量较小,需要频繁增加,删除操作的场景,查询操作相对较少;
入栈操作:
出栈操作:
栈的特点:先进后出,Java中的栈内存就是一个栈的数据结构,先调用的方法要等到后调用的方法结束才会弹栈(出栈);
队列的特点:先进先出;
树是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做 “树” 是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:
树的分类有非常多种,平衡二叉树(AVL)、红黑树RBL(R-B Tree)、B树(B-Tree)、B+树(B+Tree)等,但最早都是由二叉树演变过去的;
二叉树的特点:每个结点最多有两颗子树
堆的特性:如果一个结点的位置为k,则它的父结点的位置为[k/2],而它的两个子结点的位置则分别为2k和2k+1。这样,在不使用指针的情况下,我们也可以通过计算数组的索引在树中上下移动:从arr[k]向上一层,就令k等于k/2,向下一层就令k等于2k或2k+1。
堆的定义如下:n个元素的序列{k1,k2,ki,…,kn}当且仅当满足下关系时,称之为堆;
(ki <= k2i,ki <= k2i+1)
或者(ki >= k2i,ki >= k2i+1)
满足前者的表达式的成为小顶堆(小根堆),满足后者表达式的为大顶堆(大根堆),很明显我们上面画的堆数据结构是一个大根堆;
大小根堆数据结构图:
一般来说将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。
散列表首先需要根据key来计算数据存储的位置,也就是数组索引的下标;
散列表就是把Key通过一个固定的算法函数既所谓的哈希函数转换成一个整型数字,然后就将该数字对数组长度进行取余,取余结果就当作数组的下标,将value存储在以该数字为下标的数组空间里,这种存储空间可以充分利用数组的查找优势来查找元素,所以查找的速度很快。
在散列表中,左边是个数组,数组的每个成员包括一个指针,指向一个链表的头,当然这个链表可能为空,也可能元素很多。我们根据元素的一些特征把元素分配到不同的链表中去,也是根据这些特征,找到正确的链表,再从链表中找出这个元素。
图分为有向图和无向图:
例如,我们可以把图这种数据结构看做是一张地图:
地图中的城市我们看做是顶点,高铁线路看做是边;很显然,我们的地图是一种无向图,以长沙到上海为例,经过的城市有长沙、南昌、杭州、上海等地;那么从上海也可以按照原有的路线进行返回;
实现了图这种数据结构之后我们可以在此数据结构上做一些复杂的算法计算,如广度优先搜索算法、深度优先搜索算法等;
例如上图:以武汉为例进行广度搜索,
1)首先搜索合肥、南昌、长沙等城市;
2)通过合肥搜索到南京;
3)再通过南昌搜索到杭州、福州,
4)最终通过南京搜索到上海;完成图的遍历搜索;
不通过南京搜索到杭州是因为已经通过南昌搜索到杭州了,不需要再次搜索;
例如上图:以武汉为例进行深度搜索,
1)首先搜索合肥、南京、上海等城市;
2)回到武汉,进行第二子顶点的搜索,搜索南昌、杭州等地;
3)回到南昌,搜索福州;
4)回到武汉,搜索长沙;
图是一种比较复杂的数据结构,在存储数据上有着比较复杂和高效的算法,分别有邻接矩阵 、邻接表、十字链表、邻接多重表、边集数组等存储结构。我们本次了解到这里即可;
本文着重介绍sharding的基本思想和理论上的切分策略,关于更加细致的实施策略和参考事例请参考我的另一篇博文:数据库分库分表(sharding)系列(一) 拆分实施策略和示例演示一、基本思想 Sharding的基本思想就要把一个数据库切分成多个部分放到不同的数据库(server)上,从而缓解单一数据库的性能问题。不太严格的讲,对于海量数据的数据库,如果是因为表多而数据多,这时候适合使
VARCHAR2( ) 存储字符,可变长度,有最大长度,最大4000字节 NUMBER 存储数字 DATE 存储日期 ...
最近整理了一下以前写的代码以前用的tp5写的 tp5.1改了引用方法 所以用composer 方便一点附上代码 下载类库composer require phpoffice/phpexcel下载方法public function out(){ $leaves=db('leave')->where($where)->select(); $objPHPExcel=new \PHPExcel(); //设置表头信息 $objPHPExce
1、HDFS的设计HDFS是什么:HDFS即Hadoop分布式文件系统(Hadoop Distributed Filesystem),以流式数据访问模式来存储超大文件,运行于商用硬件集群上,是管理网络中跨多台计算机存储的文件系统。HDFS不适合用在:要求低时间延迟数据访问的应用,存储大量的小文件,多用户写入,任意修改文件。 2、HDFS的概念HDFS数据块:HDFS上的文件被划分为块大小的多个分块...
webkit-overflow-scrolling: touch;position:absolute;z-index:1;
纯模拟即可 1 #include <stdio.h> 2 #include <string.h> 3 4 int a[10] = {6, 2, 5, 5, 4, 5, 6, 3, 7, 6}; 5 int num[1000]; 6 int main() 7 { 8 freopen("alarm.in", "r", ...
最近的实习任务中要求使用pytq进行qgis的二次开发,在这个过程中那我们用到了tableview这个插件,对于这个插件,我们要求通过选择事件在tableview里面显示数据,更改表格数据并获取更改后的数据,下面我将逐步介绍如何实现此操作:使用QT designer设计一个table view控件,如下图所示:上面两个按钮,一个用来生成数据、一个用来获取数据;在设计完成ui界面以后,接下来我们要将ui界面转换成py文件;我们ui.py文件内容如下:// ui.py# -*- coding.
step1、准备安装环境Ubuntu16.04step2、按照4418的wiki首先下载编译器:git clone https://github.com/friendlyarm/prebuilts.git -b master --depth 1注意:从GitHub上clone的速度可能非常慢(10-20kb/s),而4418的wiki中只给了这种下...
函数作用:用于从src拷贝count个字节到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域区域的字节拷贝到目标区域中,但复制后src内容会被更改,但是当目标区域与源区域没有重叠则和memcpy函数功能相同。memmove可以被分为三种情况:1.dest&lt;src,源内存的首地址大于目标内存的首地址,进行正向拷贝,此时无需担心dest+coun...
我们来看一个制作system.img的命令实例说明制作system.img的过程。
科技广场2009.30引言随着计算机技术的成熟与广泛应用,以计算机信息系统为犯罪对象和以计算机为犯罪工具的各类新型犯罪活动持续上升。计算机取证是将计算机调查和分析技术应用于对存在计算机和相关外设中潜在的、有法律效力的电子证据的确定与获取。目前计算机取证作为计算机安全领域的一个新的热点正引起人们的普遍关注。1计算机取证的概念1.1什么是计算机取证计算机取证(Computer Forensics)这个...
转载自: https://codeday.me/bug/20181022/323103.html我已经实现了一个URL Scheme并使用它通过调用方法将数据传递给我的应用程序.整个代码如下所示 - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{ // Check th...