特殊链表
就链表而言,其不仅仅有单链表,相反其拥有更多种类,此文讲述一些特殊的链表。
静态链表
链表一定要用指针的方式来实现吗?脱离了指针之后,链表就没法实现吗?答案当然是否定的,链表还可以用数组代替指针来实现
定义: 用数组描述的链表叫做动态链表
首先要知道的肯定是如何实现,以及怎样实现了,如下:
代码:
12345#define MAXSIZE 1000typedef struct{ Element data ; int cur ; // 游标 为0时无指向} Component,StaticLinkList[MAXSIZE] ;
首先设计一个结构体,分为两个数据 —— data(用来存储链表节点的数据) cur(用来存储下一个结点在数组中的下标) 之后定义两个结构变量 —— Component (单个结点)StaticLinkList[MAXSIZE] (静态链表)
既然已经实现,就可以了解相关操作的实现方法了
此后所有描述均为在线性表中的操作
由于数组的空间是一次性申请的,因此我们可以将其简单地理解为数组包含着两个链表 ...
数据结构
数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间关系和操作等相关问题的学科。
起源: 1968年,美国高德纳(Donald E. Knuth)教授所写的《计算机程序设计艺术》第一卷《基本算法》中,较为系统地阐述了数据的逻辑结构和存储结构及其操作,开创了数据结构课程体系。
基本概念和术语
数据
描述事物的客观符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。
内容: 1. 数值型数据: 整型、实型等(可通过计算机直接进行数值计算) 2. 非数值型数据: 字符,声音、图像、视频等(后三者可以通过编码方式转换成字符数据,进而在计算机上进行处理)
数据元素
组成数据的有一定意义的基本单位,计算机中通常作为整体处理。也被称为记录。
数据项
一个数据元素可以由若干个数据项组成,数据项是数据不可分割的最小单位。
注: 数据项虽为数据不可分割的最小单位,但讨论问题时,数据元素才是数据结构中建立数据模型的着眼点。
数据对象
性质相同的数据元素集合,是数据的子集
数据结构
相互之间之间存在一种或多种特定关系的数据元素 ...
平衡二叉树
搜索树中,由于结点插入顺序不同,将导致不同的深度和不同的平均查找长度(ASL) 二叉搜索树一般ASL计算方法:(每层结点个数 * 层数)之和 / 结点个数
平衡因子(Balance Factor BF):
BF(T) = \(h_L\) - \(h_R\) (注:\(h_L\) 和 \(h_R\)分别为左右子树的高度)
平衡二叉树(Balance Binary Tree):AVL树 空树,或者任意结点左右子树高度差绝对值不超过1,即|BF(T)| <= 1
平衡二叉树是为了提升查找效率而提出的一种树的结构,其是基于二叉搜索树的,也就是满足二叉搜索树右大左小的道理。 所以给定节点数为n的AVL树,其最大高度为O(\(log_2n\))
AVL树的结构代码:
12345678910/* AVL树的类型 */typedef struct AVLNode *Position;typedef Position AVLTree;struct AVLNode{ ElementType Data; // 结点数据 AVLTree Left; // 左 ...
二叉搜索树
二叉搜索树(BST,Binary Search Tree), 也称二叉排序树或二叉查找树
定义:一棵二叉树,可以为空;如果不为空,满足以下性质:
非空左子树的所有键值小于其根结点的键值。
非空右子树的所有键值大于其根结点的键值。
左、右子树都是二叉搜索树。
二叉搜索树操作的一些重要函数
Position Find( ElementType X, BinTree BST ):从二叉搜索树BST 中查找元素X,返回其所在结点的地址;
Position FindMin( BinTree BST ):从二叉搜索树BST中查找并返回 最小元素所在结点的地址;
Position FindMax( BinTree BST ) :从二叉搜索树BST中查找并返回 最大元素所在结点的地址。
BinTree Insert( ElementType X, BinTree BST ) :
BinTree Delete( ElementType X, BinTree BST ):
二叉树的搜索
查找从根结点开始,如果树为空,返回NULL
若搜索树非空,则根结点关键字和 ...
二叉树
树
树(Tree): n(n≥0)个结点构成的有限集合。 当n=0时,称为空树; 对于任一棵非空树(n> 0),它具备以下性质:
树中有一个称为“根(Root)”的特殊结点,用 r 表示;
其余结点可分为m(m>0)个互不相交的有限集T1,T2,... ,Tm,其 中每个集合本身又是一棵树,称为原来树的“子树(SubTree)”
树的一些基本术语
结点的度(Degree):结点的子树个数
树的度:树的所有结点中最大的度数
叶结点(Leaf):度为的结点
父结点(Parent):有子树的结点是其子树 的根结点的父结点
子结点(Child):若A结点是B结点的父结点,则称B结点是A结点的子结点;子结点也 称孩子结点。
兄弟结点(Sibling):具有同一父结点的各 结点彼此是兄弟结点。
路径和路径长度:从结点n1到nk的路径为一 个结点序列n1 , n2 ,… , nk , ni是 ni+1的父结 点。路径所包含边的个数为路径的长度。
祖先结点(Ancestor):沿树根到某一结点路 径上的所有结点都是这个结点的祖先结点。
子孙结点(D ...
算法复杂度初探
研究算法,研究什么?
算法的原理:即此算法为何被提出来,其解决问题的原理是什么
算法的复杂度:即此算法快不快,有多快;需要的额外空间是多少,大不大。
而在研究之前,首先应知道相关基础知识。
算法分析是理论研究,是关于计算机程序性能和资源利用的研究。
Q: 既然算法与计算机程序性能有关,那么性能就必须放在第一位吗?
A: 对于有些问题的处理方案(即算法),以现在的技术,在计算机上进行运算或者处理,但时间是无限久远的,或者无法在短时间内解决,这时候就应该将算法置于首位,提升算法解决问题的速度。
对于有些问题,已有的算法已经能够在短时间解决问题,那么算法就不应该被摆在第一位,那么这时就会考虑其他因素:成本,简洁度,安全性,稳定度等等。
我们向往速度,所以我们总是在追求速度——更快的交通,更快的网络。或许这也是为什么算法会吸引这么多人学习的原因吧!
符号说明
\(O(g(n))\) 大 \(O\) 符号,表示复杂度的上限为 \(g(n)\) 的 \(c\) 倍( \(c\) 为常数)
\(\Omega (g(n))\) 大 \(\Omega\) 符 ...
练习
生成五个不重复的随机数
一道蛮有意思的练习
生成随机数储存在数组中,然后判断数组中元素是否重复,如果重复,则推倒重新生成
这是我刚开始的想法,后来发现思路用代码实现起来较为困难,而且效率不高,于是摒弃了这种实现方法。
每生成一个随机数,进行一次判断,数组中没有此元素,则存入数组,否则重新生成。
此方法为参照教程思路,效率比较高,而且代码实现也不是很困难,遂采用此种方法实现
代码
123456789101112131415161718192021222324252627282930313233import java.util.Random;public class Test02 { public static void main(String[] args) { int index = 0; int [] k = new int[5]; while (index < 5){ Random r = new Random(); int te ...
线性表
线性表
由同类数据元素构成有序序列的线性结构
表中元素个数称之为线性表的长度
线性表没有元素时称为空表
表起始位置称表头 ,表结束位置称表尾
类型名称 :线性表(List)
数据对象集 :线性表是n(>=0)个元素构成的有序序列
操作集 :
List MakeEmpty() 初始化一个空表
ElementType FindKth() 根据位序K,返回相应元素
int Find(ElementType X, List Ptrl) 在线性表L中查找X的第一次出现位置
void Insert(ElementType X,int i,List Ptrl) 在位序i前插入一个新元素
void Delete(int i,List L) 删除指定位序i的元素
int Length(List L) 返回线性表L的长度
......
线性表的顺序存储实现
用数组的连续储存空间顺序存放线性表的个元素
代码
1234567typedef struct LNode *List; //用*List指针代替LNodestruct LNode{ ...
二分查找
二分查找,显而易见就是每次一分为二的查找方式。其先决条件为必须要在数组中实现,且查找的数据必须已经排序完毕。
首先我们来看一个二分查找库函数的实现:
C语言 代码:
1234567891011121314151617181920212223242526/** * * @param key 需要查找的元素 * @param base 查找数组 * @param n 数组大小 * @param elemSize 数组元素字节数 * @param cmpfn 比较函数 * @return */void* BSearch(void* key, void* base, int n, int elemSize, int (*cmpfn) (void*, void*)) { int left = 0, right = n; while (left <= right) { int mid = left + (right - left)/2; void* elemAddr = (char*) base + mid*elemSize; int tmp = c ...
初入博客世界
在大佬分享的链接以及自己胡乱操作之后,我的博客终于是搭建完成了,这里附上两个起了主要作用的链接吧!
知乎 吴润的详细示例
主要的步骤就是依照上述文章进行,但文中仍然有一些小的细节并没有提出
1.安装过程中路径应该使用英文,这也是很多软件安装的必要条件。
使用npm命令安装Hexo,输入: npm install -g hexo-cli 这个安装时间较长耐心等待,安装完成后,初始化我们的博客,输入: hexo init blog 注意,这里的命令都是作用在刚刚创建的Blog文件夹中。
2.进行完这步操作之后,Blog文件夹中应该会生成一个blog文件夹,之后的三条命令就需要切换 到blog文件夹之后再进行操作。
为了检测我们的网站雏形,分别按顺序输入以下三条命令: hexo new test_my_site hexo g hexo s
博客园 cherishzy的示例
这一篇,是我在与GitHub关联出错之后搜到的一篇解决方案,而他的一些经验刚好完美解决了我所遇到的问题。
在自己的Github主页右下角,创建一个新的repository。比如我的G ...