数据项

《大话数据结构》

爷,独闯天下 提交于 2020-01-06 16:35:02
第一章 数据结构绪论 数据结构: 是相互之间存在一种或多种特定关系的数据元素的集合。 1.3 数据结构起源   早期人们把计算机理解为数值计算攻击,就是感觉计算机当然是用来计算的,所以计算机解决问题,应该是先从具体问题中抽象出一个社和的数据模型,设计出一个解此数据模型的算法,然后再编写程序,得到一个实际的软件。   可现实中,我们更多的不是解决数值计算的问题,而是需要一些更科学有效的手段(比如表、树和图等数据结构)的帮助,才能更好的处理问题。所以数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及他们之间的关系和操作等相关的学科。   程序设计=数据结构+算法 1.4 基本概念和术语 数据:是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。   数据不仅仅包括整型、实型等数值类型,还包括字符及声音、图像、视频等非数值类型。 数据元素:是组成数据的、有一定意义的基本单位,在计算机中通常作为整体处理。也被称为记录。   比如人类的数据元素是:人;   畜类的数据元素是:马、牛、羊、猪等; 数据项:一个数据元素可以由若干个数据项组成。    比如人这样的数据元素,可以有眼、耳、鼻、嘴、手、脚这些数据项;也可以有姓名、年龄、生日、电话、住址  等数据项。   数据项是数据不可分割的最小单位。 数据对象:是性质相同的数据元素的集合

第1章.Collections类、泛型类和Timing类概述

末鹿安然 提交于 2020-01-02 04:41:37
1.1 群集(collection)的定义 群集是一种结构化的数据类型。 它存储数据,并且提供数据的添加、删除、更新操作,以及对群集的不同属性值的设置与返回操作。 群集可以分为两类:线性的和非线性的。 线性群集是一张元素列表,表中的元素顺次相连。线性群集中的元素通常由位置来决定次序。在现实世界中,购物清单就是很好的线性群集实例。而在计算机世界中则把数组设计成线性群集。 非线性群集所包含的元素在群集内没有位置次序之分。组织结构图就像用架子垒好的台球一样是一个非线性群集的实例。而在计算机世界中树、堆、图和集都是非线性群集。 无论是线性的还是非线性的群集都拥有一套定义好的属性和操作的集合。其中,属性用来描述群集,而操作就是群集能执行的内容。 1.2 群集(collection)的描述 有两种主要的群集类中有几个子类别。 线性的群集可能是直接存取群集,也可能是顺序存取群集。而非线性的群集既可以是层次群集,也可以是组群集。 1.2.1 直接存取群集 直接存取群集最常见的实例就是数组。 这里把数组定义为具有相同数据类型的元素的群集,而且所有数组元素可以通过整数型索引直接进行存取访问。 数组可以是静态的,这样当声明数组的时候便于针对程序的长度来固定指定元素的数量。数组也可以是动态的,通过ReDim或者ReDim Preserve语句就可以增加数组元素的数量。 在C#中,数组不只是内置的数据类型

数据库-并发控制

点点圈 提交于 2019-12-29 03:01:33
当多个事务在数据库中并发执行时,数据的一致性可能受到破坏。系统有必要控制各事务之间的相互作用,这是通过并发控制机制的多种机制中的一种来实现的。 避免事务"饿死",授权加锁的条件:不存在在数据项Q上持有与M型锁冲突的锁的其他事务;不存在等待对数据项Q加锁且先于Ti申请加锁的事务。 常用的机制是各种封锁协议,时间戳排序,有效性检查,多版本机制。 封锁协议是一组阐明了事务合适对数据库中的数据项加锁解锁的规则。 两阶段封锁协议 仅在一个事务未曾释放任何数据项时允许该事务封锁新数据项。该协议保证可串行性,但不能避免死锁。在缺少有关数据项存取方式的信息是,两阶段封锁协议对保证可串行化来说不仅是必要的而且是充分的。 树形协议 规则:1、Ti的首次加锁可以对任何数据项进行。2、此后Ti对数据项Q加锁的前提是Ti持有Q的父项上的锁。3、对数据项解锁可以随时进行。4、数据项被Ti加锁并解锁后,Ti不能再对该数据项加锁。 时间戳排序机制 通过事先在每对事务之间选择一个顺序来保证可串行性。系统中的每个事务对应一个唯一的固定的时间戳。事务的时间戳决定了事务的可串行化顺序。这样,如果事务Ti的时间戳小于事务Tj时间戳,则该机制保证产生的调度等价于事务Ti出现在事务Tj之前的一个串行调度。该机制通过回滚违反该次序的事务来保证这一点。 Thomas写规则: 假设事务Ti发出write(Q)操作: 1、若TS(Ti

Java数据结构和算法 - 堆

好久不见. 提交于 2019-12-17 22:53:53
堆的介绍 Q: 什么是堆? A: 这里的“堆”是指一种特殊的二叉树,不要和Java、C/C++等编程语言里的“堆”混淆,后者指的是程序员用new能得到的计算机内存的可用部分 A: 堆是有如下特点的二叉树: 1) 是一棵完全二叉树 2) 通常由数组实现。前面介绍了 如何用数组表示树 3) 堆中的每个节点都满足堆的条件,即每个节点的关键字都大于(或等于)这个节点的子节点关键字 下图显示了堆与实现它的数组之间的关系: A: 堆是完全二叉树的事实说明了表示堆的数组中没有“洞”,从下标0到N-1,每个元素都有数据项 A: 本篇中假设最大的关键字在根节点,基于这种堆的优先级是降序的优先级队列 A: 若数组中节点的索引为i,则 1) 它的父节点的下标为(i - 1) / 2; 2) 它的左子节点的下标为 2 * i + 1; 3) 它的右子节点的下标为 2 * i + 2 Q: 弱序? A: 堆相对于二叉搜索树比较而言是弱序的,在二叉搜索树中所有的节点的左子孙的关键字都小于右子孙的关键字。二叉搜索树可以通过简单的算法就可以按序遍历节点,但在堆中,按序遍历节点是困难的,这是因为堆的组织规则比二叉搜索树的组织规则弱。 A: 对堆来说,只要求沿着从根到叶子的每一条路径,节点都是按降序排列 A: 在堆中不能便利地查找指定的关键字,因为在查找过程中,没有足够的信息来决定选择通过节点的哪一个子节点走向下一层

Redis源码剖析--列表t_list

对着背影说爱祢 提交于 2019-12-15 14:25:18
上一篇博客Redis源码剖析–快速列表 带大家一起剖析了quicklist这个底层数据结构的实现原理。Redis对外开放的列表list结构就是采用quicklist作为底层实现(在新版本的Redis源码中,不再采用ziplist和sdlist两种结构,而是统一采用quicklist)。有关列表键的实现源码在t_list.c文件中,大家可以边看源码边看这篇博客,一起来理解。 List概述 其实在Redis源码剖析—对象Object一文中有一个错误,list数据类型的底层编码并没有采用ziplist和sdlist,而是统一采用quicklist作为底层数据结构,这点需要提前说明一下。Redis的新版本中,list的底层编码类型只有OBJ_ENCODING_QUICKLIST,那么原先关于合适进行编码类型转换的代码都省略了。 列表没有其特有的数据结构,而是采用RedisObject作为其泛型数据结构,当RedisObject的type字段为OBJ_LIST时,该对象被认为是一个列表。 Redis为列表提供了迭代器结构,本质就是quicklist迭代器的基本上做了一层封装。 typedef struct { robj *subject; // 迭代器指向的对象 unsigned char encoding; // 编码类型 unsigned char direction; // 迭代器方向

Redis源码剖析--快速列表quicklist

我与影子孤独终老i 提交于 2019-12-14 17:19:07
在RedisObject这一篇博客中,有介绍到list结构的底层编码类型有OBJ_ENCODING_QUICKLIST,当时就发现这个底层数据结构被我遗漏了。昨天花了点时间补了补这个知识,看完发现这货就跟STL中的deque的思想一样,顿时觉得又是一个实现超级繁琐但很实用的数据结构。今天就带大家一起来看看这个“二合一”的数据结构。 quicklist是Redis在3.2版本加入的新数据结构,其是list列表的底层数据结构。 quicklist简介 为什么说quicklist是“二合一”呢?如果你看过STL中的deque的实现,就会知道deque是由一个map中控器和一个数组组成的数据结构,它既具有链表头尾插入便捷的优点,又有数组连续内存存储,支持下标访问的优点。Redis中是采用sdlist和ziplist来实现quicklist的,其中sdlist充当map中控器的作用,ziplist充当占用连续内存空间数组的作用。quicklist本身是一个双向无环链表,它的每一个节点都是一个ziplist。为什么这么设计呢? 双向链表在插入节点上复杂度很低,但它的内存开销很大,每个节点的地址不连续,容易产生内存碎片。 ziplist是存储在一段连续的内存上,存储效率高,但是它不利于修改操作,插入和删除数都很麻烦,复杂度高,而且其需要频繁的申请释放内存,特别是ziplist中数据较多的情况下

B树中的M阶是什么含义?

亡梦爱人 提交于 2019-12-14 00:13:19
描述一颗 B树时需要指定它的阶数,阶数表示了一个结点 最多 有多少个孩子结点,一般用字母 M 表示阶数。 当 M取 2 时,就是我们常见的二叉搜索树。 而B树,根结点的阶数M >= 2(至少有两个子节点), 其他节点数必须 >= 3 。 其实, M阶 就是 M树。 一颗 M树上,最多有 M 个子树。例如, 2(叉)树,即内含 1个数据项 和 2 个子树(这里的子树 也叫做 引用、链接等); 3(叉)树,即内含 2个数据项 和 3 个子树 ; 4(叉)树,即内含 3个数据项 和 4 个子树 ; 5(叉)树,即内含 4个数据项 和 5 个子树 ; 故,M(叉)树,即内含(M-1)个数据项 和 M 个子树 ; 所以, M阶 可理解为 M(叉)树,即内含(M-1)个数据项和 M 个子树。 注意: 在B树中,M>=3,所以B树至少是 3(叉)树(不太严谨的说法); M阶,确切的是指 平衡的 M 路查找树 。 如图所示: 来源: CSDN 作者: az44yao 链接: https://blog.csdn.net/az44yao/article/details/103533052

数据结构与算法之数组

房东的猫 提交于 2019-12-08 15:17:56
本章重点: 1.Java中数组的基础知识; 创建数组: 在许多的编程语言中(甚至有些面向对象语言,如c++),数组也是基本类型,但是在Java中把他们当做对象来对待,因此在创建数组时必须使用new操作符: int[] intArray; intArray = new int[100]; []操作符对于编译器来说是一个标志,它说明正在命名的是数组对象而不是普通的变量。 或: int[] intArray = new int[100]; int intArray[] = new int[100]; 由于数组是一个对象,所以它的名字intArray是数组的一个引用,而不是数组本身。数组存储在内存中的其他地址中,而intArray仅仅保存着这个地址。正如大多数编程语言一样,数组一旦被创建,数组大小便不可改变。 访问数组数据项: 数组数据项通过使用方括号中的下标数来访问: temp = intArray[3]; 注意:无论是在c、c++,还是java中,第一个数据项的下标都是0,所以一个有10个数据项的数组下标是从0到9.强撸会报Array Index Out Of Bounds数组越界错误。 初始化: 当创建整型数组之后,如果不另行指定,那么整型数组会自动初始化为空。与C++不同的是,即使通过方法来定义数组也是这样的。创建一个对象数组如下: autoData[] carArray =

MySQL数据库

大城市里の小女人 提交于 2019-12-08 05:13:25
MySQL数据库 预备知识: 0、 MySQL 数据怎么存储数据?怎么高数查询数据?怎么实现事务的ACID?实际使用涉及哪些数据结构和算法,MySQL和redis的区别是什么? 0、1数据库管理系统(DBMS-Database Management System)使用 数据引擎 进行 创建、查询、更新和删除数据 。一个数据库可以使用多个数据引擎以满足各种性能和实际需求。 0、1、1、 InnoDB引擎 创建一个表,在硬盘上会生成 .frm.idb 结尾的两个文件。索引和数据在以.db结尾的文件中。 InnoDB存储引擎在存储数据的时候,默认按照b+树形结构存储数据。如果以 主键 作为b+树结构的 数据项 则为 聚集索引 ! 0、1、2、 MyISAM存储引擎 创建一个表,在硬盘上生成以 . f rm.MYD.MYI 结尾的三个文件。frm结尾的是 表结构( 存什么字段什么类型 ) ,MYD结尾的是 数据文件 ,MYI结尾的就是 索引文件 ,所以索引也是存在硬盘上的。 0、1、3、 MEMORY存储引擎 ,将表中的数据存储到内存中,未查询和引用其他表数据提供快速访问。 注:如果要提供提交、回滚、崩溃恢复能力的 事物安全(ACID兼容)能力 ,并要求实现并发控制, InnoDB 是一个好的选择;如果数据表主要用来 插入和查询记录 ,则 MyISAM引擎 能提供较高的处理效率;如果只是

如果让你手写个栈和队列,你还会写吗? 侵立删

僤鯓⒐⒋嵵緔 提交于 2019-12-06 06:57:57
来源:程序员私房菜(ID:eson_15) 昨天跟一个CSDN上的朋友聊天,他说现在如果让他自己手写一个栈或者队列,估计都要写蛮久的,平时虽然都在用,但是都是别人封装好的集合。 确实,经典的数据结构,包括排序算法,虽然我们平时不用手写了,但是这些内功,作为开发人员来说是必须要掌握的。受此启发,我打算更一下经典数据结构和算法的系列文章。今天先从栈和队列说起。 这些东西,挤地铁时,吃饭排队时,等公交时,可以拿来看看,或者,就把它当作个下午茶吧~ 我们知道,在数组中,若知道数据项的下标,便可立即访问该数据项,或者通过顺序搜索数据项,访问到数组中的各个数据项。但是栈和队列不同,它们的访问是受限制的,即在特定时刻只有一个数据项可以被读取或者被删除。众所周知,栈是先进后出,只能访问栈顶的数据,队列是先进先出,只能访问头部数据。这里不再赘述。 栈的主要机制可以用数组来实现,也可以用链表来实现,下面用数组来实现栈的基本操作: class ArrayStack { private long[] a; private int size; //栈数组的大小 private int top; //栈顶 public ArrayStack(int maxSize) { this.size = maxSize; this.a = new long[size]; this.top = -1; //表示空栈 }