数据结构概论

Nicklaus Wirth, 因为一个著名的公式而获得了图灵奖, 那就是"算法+数据结构=程序"。由此可见数据结构的重要性。本系列旨在探索数据结构的实现与原理,使得人人都懂数据结构,都会设计数据结构。


本篇文章为数据结构系列的开篇, 目的很明确,让大家了解数据结构的概念与组成, 帮大家创建一个系统的数据结构知识体系。让我们从0开始,窥见数据结构。

1.什么是数据结构?

先引入百度百科的定义

数据结构是计算机存储、组织数据的方式。
数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。
通常情况下,精心选择的数据结构可以带来更高的运行或者存储[效率]。数据结构往往同高效的检索[算法]和[索引]技术有关。

从以上定义来看,数据结构是数据的一种组织形式。我从这个定义提取了两个重要的因素:

数据元素
特定关系

通俗定义,根据个人理解就是,数据结构是若干数据,根据一定的关系组合在一起形成的组织形式。很抽象?我也这么觉得。下面从两个重要的因素谈起:

生活中任何一个事物都可以看作一个数据元素, 而且每个事物都可以随意赋予一个代表数值;当然平时我们以它实际代表的意义作为它的值。如一双鞋, 一个风扇, 一堆沙子,一个世界;我们分别可以把把它的值看作一双(1),也可以看作两只(2);一台(1),四个扇叶(4);一堆(1), 30万颗(300000);一个(1), 无穷大(正无穷)。从这个例子来看, 万物皆数字(数据元素),它的值你可以随意想象(角度不同,值自然不同)。

生活中所有的事物都是有关系的,这个关系也可以称之为数据元素的特定关系。还是上面的例子, 一双鞋与单独的两只,一台风扇与四个扇叶, 一堆沙子与沙子颗粒, 一个世界与世界内的一切。 两只鞋得左脚与右脚, 风扇与沙子, 鞋,风扇,沙子与世界。万物皆存在关联(没有任何关系的两个事物之间,也称为一种关系)。

从以上说法来看, 我们的世界可以看成一个巨大的数据结构;世界内的任何元素也可以看成一个数据结构。还是那句话,角度不同。

可能很多人纳闷了,说这些干嘛呢,驴唇不对马嘴的? 答案是,我在培养你一种数据结构的眼光。就像是Java中的所有实现你都要看成对象(面向对象), C中的所有实现你都要看成过程(面向过程),不同模块下的同一抽象看成切面(面向切面),数据结构同样如此。只有具备了这种思维,理解起来容易的多,而且你可以根据现实去总结出自己的数据结构;这也是为什么Nicklaus Wirth把所有程序看成是算法+数据结构的组合了。

2.数据结构的关系有什么?

不同的角度下, 数据元素的关系是千千万的;但是总结起来,大抵分为4类:

image.png

上图是数据结构的四种关系:集合, 线性关系, 树, 图。 其实是正好囊括生活中的所有关系的,不是么? 解释起来,分别是

集合: 任意两个元素之间都是独立的,也即没有关系
线性: 元素之间存在1对1的关系(两个元素之间只有唯一的对应关系,如1和2, 2和3等)
树: 元素之间存在1对多的关系(每个父节点对应N个子节点, 如A节点对应B和C两个子节点)
图: 元素之间存在多对多的关系(任何一个顶点都可能对应多个关系,如A对应和另外的节点都存在关系)

其实现实生活中的对应关系也是这样, 从无关系(集合),到有关系(线性),再复杂一点(树)从1-1到了1-N,然后再复杂一点(图)从1-N到了N-N, 这就是最复杂的关系了。当然, 说这些只是为了相对好理解。


3.程序(Java)中的数据结构的关系是什么?

Java是一种面向对象编程, 因此在设计数据结构时,会采用各种接口, 抽象类, 继承等;所以Java中的数据结构是一个复杂的关系网络,借用网上一张关系图来看一下


image.png

从上图来看, 数据结构的关系还是很复杂的。大抵分为三层: 1) 公共接口层 2) 数据抽象层 3) 数据结构层

公共接口层

主要包括Iterator, Collection, Map; 分别对应迭代器, 集合, 图。 公共接口层主要作用是定义一系列的公共操作,提供一个执行规范。

Iterator

迭代器,我们可以简单的理解为遍历。 它是一个标准的遍历所有对象的接口。
——————————————————————————————
boolean hasNext();
E next();
——————————————————————————————

Collection

集合,我们并不陌生。看上图就知道,它衍生了主要的几种线性结构。 我们使用的List,Set等系列结构都是它的衍生类。
——————————————————————————————
int size();
boolean isEmpty();
boolean contains(Object o);
Object[] toArray();
boolean add(E e);
boolean remove(Object o);
boolean containsAll(Collection<?> c);
boolean addAll(Collection<? extends E> c);
boolean removeAll(Collection<?> c);
void clear();
——————————————————————————————

Map

图, 或者称之为表最合适,但是此图非彼图。图是一种基于键值对即Key-Value形式存储的结构,我们经常使用的HashMap即衍生于此。
———————————————————————
int size();
boolean isEmpty();
boolean containsKey(Object key);
boolean containsValue(Object value);
V get(Object key);
V put(K key, V value);
V remove(Object key);
void clear();
...
———————————————————————
Map是一种基于键值对(Key-Value)存储的结构,因此所有操作都是基于键值对操作。我们使用的HashMap, TreeMap, HashSet等都是基于此而来。

List

提供了列表的系列功能, 至于详细的我真不想说了,没有人没用过List是真的,大家都比我熟。它提供的方法与Collection类似,甚至近乎相同。

Set

Set结构有两个重要的特点: 无序性和唯一性。 Set的元素期存入顺序和取出顺序是不一致的,如先后存储ABC,在Set中的元素位置并不一定是ABC,可能是BCA或者其他。 Set的值是唯一的,即Set不允许添加相同值。Set直接继承自Collection, 没有新增方法。

Queue

提供了队列的系列功能,队列是一种先进先出的结构。它提供了以下方法
——————————————————————
boolean add(E e);
boolean offer(E e);
E remove();
E poll();
E element();
E peek();
——————————————————————
队列可能在平时用的很少, 像队列, 栈等结构很多时候可以更方便的解决问题。


结构封装层

实现了公共接口, 对某一类型或某具有相似特征的类型提供基类支持。该层主要包含AbstractMap, AbstractList, AbstractSet等针对底层接口的一些公共的处理,不详细说明。

结构层

这层涉及到具体的数据结构,如List下的ArrayList, LinkedList,Vector; Set下的HashSet, LinkedHashSet,
TreeSet; Map下的HashMap, LinkedHashMap, HashTable, TreeSet等。

《数据结构》系列的目的是理清数据结构的框架 , 了解不同结构的特征,详细讲解不同的具体数据结构以及核心部分的原理。下面将按线性表, 树, 图的大顺序来讲解数据结构;其中顺序表又包含上图中的部分常用的结构。


目录

线性表
顺序表
List系列
Set系列
Queue系列
Vector系列
Stack
Map系列
链表
单链表
双链表


二叉树
二叉排序树
完全二叉树
红黑树
..

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,340评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,762评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,329评论 0 329
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,678评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,583评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,995评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,493评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,145评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,293评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,250评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,267评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,973评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,556评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,648评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,873评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,257评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,809评论 2 339

推荐阅读更多精彩内容