数据结构

数据结构

文章更新中

文档版本修订时间修订内容修订人
1.0.018/12/27初稿Wagsn


通常来说,一个数据结构DS 可以表示为一个二元组:
DS=(D,S) //data-structure=(data-part,logic-structure-part)
这里D是数据元素的集合(或者是“结点”,可能还含有“数据项”或“数据域”),S是定义在D(或其他集合)上的关系的集合,S = { R | R : D×D×…},称之为元素的逻辑结构。
逻辑结构有四种基本类型:
集合结构、线性结构、树状结构和网络结构。
表和树是最常用的两种高效数据结构,许多高效的算法可以用这两种数据结构来设计实现。
表是线性结构的(全序关系),树(偏序或层次关系)和图(局部有序(weak/local orders))是非线性结构。

四种基本结构 1

通常有下列四类基本的逻辑结构:

  • ⑴集合结构。该结构的数据元素间的关系是“属于同一个集合”。
  • ⑵线性结构。该结构的数据元素之间存在着一对一的关系。
  • ⑶树型结构。该结构的数据元素之间存在着一对多的关系。
  • ⑷图形结构。该结构的数据元素之间存在着多对多的关系,也称网状结构。

容器分类:

  • 无序 重复 Collection
  • 有序 重复 List
  • 无序 互异 Set
  • 有序 互异 Ordered Set

存储结构:

  • 顺序 Array
  • 链式 Link

顺序存储和链接存储是数据的两种最基本的存储结构。

Collection

// Collection 容器 无序 重复
Collection<E> : Iterable<E> {
	push (E) => Void;
	remove (E) => E;
	contains (E) => Bool;
	foreach (action: E => Void) => Void;
	count () => Int;
}

集合结构

定义

若x是集合A的元素,则记作x∈A。集合中的元素有三个特征:

  • 1).确定性(集合中的元素必须是确定的)
  • 2).互异性(集合中的元素互不相同。例如:集合A={1,a},则a不能等于1)
  • 3).无序性(集合中的元素没有先后之分),如集合{3,4,5}和{3,5,4}算作同一个集合。

伪代码

// Set 集合结构(无序,互异)Collection<E>(无序,重复)Iterable<E>(可迭代)继承树中限制越小越在上层
Set<E> : Collection<E> {
	// 子集,如果集合A的任意一个元素都是集合B的元素(任意a∈A则a∈B),那么集合A称为集合B的子集,记为A⊆B或 B⊇A,读作“集合A包含于集合B”或集合B包含集合A”。
	// 即:∀a∈A有a∈B,则A⊆B。
	containsAll (other: Set<E>) => Bool {
		for(ele in other) {
			if(!caller.contains(ele)) {  // contains x∈A
				return false;
			}
		}
		// 如果other为空集,空集是任意集合(包括空集)的子集。
		return true;
	}
	// 并集 -由所有属于集合A或属于集合B的元素所组成的集合
	// A∪B={x|x∈A,或x∈B};∅∪A=A
	addAll (other: Set<E>) => Set<E> {
		result: Set<E> := Set<E>();
		for(ele in caller) {  // "caller" is the instance of type Set<E> 
			result.push(ele);
		}
		for(ele in other) {
			if(!result.contains(ele)) {
				result.push(ele);
			}
		}
		return result;
	}
	// 交集,由属于A且属于B的相同元素组成的集合
	retainAll (other: Set<E>) => Set<E> {
		result: Set<E> := Set<E>();
		for(ele in other) {
			if(caller.contains(ele)) {
				result.push(ele);
			}
		}
		return result;
	}
	// 相对补集,由属于A而不属于B的元素组成的集合,称为B关于A的相对补集
	removeAll (other: Set<E>) => Set<E> {
		result: Set<E> := Set<E>();
		for(ele in caller) {  // "caller" is the instance of type Set<E> 
			result.push(ele);
		}
		for(ele in other) {
			if(caller.contains(ele)) {
				result.remove(ele);
			}
		}
	}
}

线性结构

分类

  • 线性表 List 可索引
  • 队列 Queue 先进先出
  • Stack 后进先出
  • 映射 Map 键值映射

线性表

伪代码
// List 线性表,可索引的 Indexable<Int, E> <=> this(index: Int)=>E
List<E> : Colletion<E>, Indexable<Int, E> {
	// var list = List<Int>(); var int0 = list(0); 00
	this (index: Int) => E;
	get (index: Int) => E;
	set (index: Int, e: E) => Void;
	remove (index: Int) => E;
	// 查询元素的索引
	indexOf (e: E) => Int {
		for(i=0; i<caller.count(); i++) {
			if (caller.get(i).equals(e)) {
				return i;
			}
		}
		return -1;
	}
	// 获取子表
	subList (fromIndex: Int, toIndex: Int) => List<E>{
		result := Lsit<E>();
		for(i=fromIndex; i<toIndex; i++){
			result.push(caller.get(i));
		}
		return result;
	}
}

树形结构

  • Tree
    • 普通树 Tree
    • 二叉树 Binary Tree
      • 完全二叉树 堆 Heap 1
    • B树 B Tree
      • B+树 B+ Tree
  • 森林

图形结构

定义:

图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。
在图中需要注意的是:

  • (1)线性表中我们把数据元素叫元素,树中将数据元素叫结点,在图中数据元素,我们则称之为顶点(Vertex)。
  • (2)线性表可以没有元素,称为空表;树中可以没有节点,称为空树;但是,在图中不允许没有顶点(有穷非空性)。
  • (3)线性表中的各元素是线性关系,树中的各元素是层次关系,而图中各顶点的关系是用边来表示(边集可以为空)。

分类:

  • 平行边
    • 多重图 含平行边的图称为多重图。
    • 简单图 既不含平行边也不包含自环的图称为简单图。
  • 连通性
    • 连通图 任意两个顶点是相通的就是连通图
  • 有向性
    • 无向图
    • 有向图
      • 有向无环图
        • AOV
        • AOE

参考:
4种基本数据结构
浅析数据结构-图的基本概念
数据结构之图的基本概念
基本数据结构――堆的基本概念及其操作

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值