.NET Core 数据结构与算法 1-1
.NET Core 数据结构与算法 1-1
本节内容为顺序表
简介
线性表是简单、基本、常用的数据结构。线性表是线性结构的抽象 (Abstract),线性结构的特点是结构中的数据元素之间存在一对一的线性关系。这 种一对一的关系指的是数据元素之间的位置关系,即:
- 除第一个位置的数据元素外,其它数据元素位置的前面都只有一个数据元素;
- 除后一个位置的数据元素外,其它数据元素位置的后面都只有一个元素。也就是说,数据元素是 一个接一个的排列。因此,可以把线性表想象为一种数据元素序列的数据结构。
本节我们对线性表中的顺序表进行一个讲解。
保存线性表简单、自然的方式,就是把表中的元素一个接一个地放进顺序的存储单元,这就是线性表的顺序存储(Sequence Storage)。线性表的顺序存储是指在内存中用一块地址连续的空间依次存放线性表的数据元素, 用这种方式存储的线性表叫顺序表(Sequence List)。说的明确一些也就是说,顺序表就是我们所接触过的数组。
线性表接口IListDS<T>
我们首先对我们会涉及到的函数进行一次封装,打包进线性表的接口中
interface IListDS<T>
{
int GetLength();//求长度,我们也可以通过属性进行操作
void Clear();//清空操作
bool IsEmpty();//判断线性表是否为空
void Append(T item);//向后追加操作
void Insert(T item, int i);//插入操作
T Delete(int i);//删除操作
T GetElem(int i);//取表元
}
对于C语言,我们很多需要使用函数进行操作,但是在C#中,我们有索引器,属性等一系列语法糖,因此我们在后面操作的时候会把这些都展示给你们看。
事实上在我们之前的C#初级教程中的综合练习,就是关于我们的线性表操作,你可以返回去参考你的代码。
顺序表类SeqList<T>
为了方便起见,我们在此处不做可变长度的线性表,如果需要使用可变长度,这里有那么一种思路供读者思考:定义一个字段为容量(Cap),一个为长度(len),长度是以及存储的空间大小,容量是总空间,如果长度和容量相等的时候,证明我们的表已经满了,那么就向后追加空的数组即可。
不过在这里我们不讨论这种,我们仅仅使用定长的就足够展示了
class SeqList<T>:IListDS<T>
{
private int length;//长度
private int size;
private int lastIndex;//最后一个元素的索引
private T[] data;
public int Length{get{return lastIndex+1;}}
//初始化
public SeqList<T>(int size)
{
this.data = new T[size];
this.lastIndex = -1;
this.size = size;
}
//清除内部元素
public void Clear()
{
this.data = new T[this.size];
lastIndex = -1;
}
//判断是否为空,只需要判断最后一个元素的索引是否为-1即可
public bool IsEmpty()
{
return lastIndex==-1?true:false;
}
//获取长度
public int GetLength()
{
return lastIndex + 1;
}
//是否已满
public bool IsFull()
{
return size == lastIndex+1?true:false;
}
//向后追加
public void Append(T item)
{
//只需要判断是否已满即可
if(!IsFull())
{
data[lastIndex++] = item;
}
else
{
Console.WriteLine("It is Full");
}
}
//在指定位置插入,index指代位置而不是索引
public void Insert(T item,int index)
{
//首先判断是否已满
if(IsFull())
{
Console.WriteLine("It is Full");
return;
}
if(index<1||index>lastIndex+2)
{
Console.WriteLine("error");
return;
}
//最后一位插入
if (i == last +2)
{
data[i-1] = item;
}
else
{
//元素移动
for (int j = lastIndex; j>= i-1; --j)
{
data[j + 1] = data[j];
}
data[i-1] = item;
}
lastIndex++;
}
public T Delete(int i)
{
T tmp = default(T);
//判断表是否为空
if (IsEmpty())
{
Console.WriteLine("List is empty"); return tmp;
}
//判断删除的位置是否正确
// i小于1表示删除第1个位置之前的元素,
// i大于last+1表示删除后一个元素后面的第1个位置的元素。
if (i < 1 || i > lastIndex+1)
{
Console.WriteLine( "Position is error!");return tmp;
}
//删除的是后一个元素
if (i == lastIndex+1)
{
tmp = data[last--];
}
//删除的不是后一个元素
else
{
//元素移动
tmp = data[i-1];
for (int j = i; j <= lastIndex; ++j)
{
data[j] = data[j + 1];
}
}
//修改表长
--lastIndex;
return tmp;
}
public T GetElem(int i)
{
if(i<1||lastIndex==-1)
{
Console.WriteLine("error");
return;
}
return this.data[i-1];
}
}
在上述代码中,我们分析一下删除和插入的操作
算法的时间复杂度分析:顺序表上的删除操作与插入操作一样,时间主要消 耗在数据的移动上在第i个位置删除一个元素,从ai+1到an都要向前移动一个位置,共需要移动n-i个元素,而i的取值范围为 1≤i≤n,当i等于 1 时,需要移动 的元素个数多,为n-1 个;当i为n时,不需要移动元素。设在第i个位置做删除 的概率为pi,则平均移动数据元素的次数为(n-1)/2。这说明在顺序表上做删除操 作平均需要移动表中一半的数据元素,所以,删除操作的时间复杂度为O(n)。
一些额外操作
我们以倒转为例,事实上我们倒转的时候,只需要将第一个和最后一个,第二个和倒数第二个以此类推进行交换即可
public void ReversSeqList(SeqList<int> L)
{
int tmp = 0;
int len = L.GetLength();
for (int i = 0; i<= len/2; ++i)
{
tmp = L[i];
L[i] = L[len - i];
L[len - i] = tmp;
}
}
各位可以尝试一下生成不含重复值顺序表和合并顺序表并有序的排列算法,这里给出一些思路。
- 去重:先把顺序表 La 的第 1 个元素赋给顺序表 Lb,然后从顺序表 La 的第 2 个元素起,每一个元素与顺序表 Lb 中的每一个元素进行比较,如果不相 同,则把该元素附加到顺序表 Lb 的末尾。
- 合并排序:依次扫描 La 和 Lb 的数据元素,比较 La 和 Lb 当前数据元素的 值,将较小值的数据元素赋给 Lc,如此直到一个顺序表被扫描完,然后将未完 的那个顺序表中余下的数据元素赋给 Lc 即可。Lc 的容量要能够容纳 La 和 Lb 两个表相加的长度。
.NET Core 数据结构与算法 1-1的更多相关文章
- 《数据结构与算法之美》 <01>复杂度分析(上):如何分析、统计算法的执行效率和资源消耗?
我们都知道,数据结构和算法本身解决的是“快”和“省”的问题,即如何让代码运行得更快,如何让代码更省存储空间.所以,执行效率是算法一个非常重要的考量指标. 那如何来衡量你编写的算法代码的执行效率呢?这里 ...
- 数据结构和算法(Golang实现)(25)排序算法-快速排序
快速排序 快速排序是一种分治策略的排序算法,是由英国计算机科学家Tony Hoare发明的, 该算法被发布在1961年的Communications of the ACM 国际计算机学会月刊. 注:A ...
- [GitHub] 75+的 C# 数据结构和算法实现
C#中标准数据结构和算法的即插即用类库项目 GitHub:https://github.com/aalhour/C-Sharp-Algorithms Watch: 307 Star: 3.4k For ...
- 开启基本数据结构和算法之路--初识Graphviz
在我的Linux刀耕开荒阶段,就想开始重拾C,利用C实现常用的基本数据结构和算法,而数据结构和算法的掌握的熟练程度正是程序的初学者与职业程序员的分水岭. 那么怎么开启这一段历程呢? 按照软件工程的思想 ...
- 【转】MySQL索引背后的数据结构及算法原理
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...
- [转]MySQL索引背后的数据结构及算法原理
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...
- MySQL索引背后的数据结构及算法原理【转】
本文来自:张洋的MySQL索引背后的数据结构及算法原理 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持 ...
- 数据结构与算法JavaScript (一) 栈
序 数据结构与算法JavaScript这本书算是讲解得比较浅显的,优点就是用javascript语言把常用的数据结构给描述了下,书中很多例子来源于常见的一些面试题目,算是与时俱进,业余看了下就顺便记录 ...
- 数据结构与算法 Big O 备忘录与现实
不论今天的计算机技术变化,新技术的出现,所有都是来自数据结构与算法基础.我们需要温故而知新. 算法.架构.策略.机器学习之间的关系.在过往和技术人员交流时,很多人对算法和架构之间的关系感 ...
随机推荐
- 中国剩余定理(CRT)及其拓展(ExCRT)
中国剩余定理 CRT 推导 给定\(n\)个同余方程 \[ \left\{ \begin{aligned} x &\equiv a_1 \pmod{m_1} \\ x &\equiv ...
- 1.Python 简单输入输出
1 读取:input() 1.1 简单打印内容 In [1]: input('你好,请输入你的名字:') 你好,请输入你的名字:小明 1.2 保存输入内容 In [2]: CN_Name = inpu ...
- 分布式系统的发展演变以及RPC简介
场景 什么是分布式系统 分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统. 分布式系统是建立在网络之上的软件系统. 注: 博客: https://blog.csdn.net/b ...
- DG重启之后主备数据不同步
问题描述:本来配置好的DG第二天重启之后,发现主备库数据不能同步,在主库上执行日志切换以及创建表操作都传不到备库上,造成这种错误的原因是主库实例断掉后造成备库日志与主库无法实时接收 主库:orcl ...
- Python活力练习Day3
Day3:请输入星期几的第一个字母来判断是星期几,如果第一个字母一样,则继续判断第二个字母. #这是一道典型的题,一次输入一个字母,首字母匹配一个list里的内容.如果匹配到多个,再输入并匹配第二个字 ...
- 工具类Arrays.asList()方法把数组转换成集合
工具类Arrays.asList()方法把数组转换成集合 不能使用其修改集合相关的方法,它的add/remove/clear方法会抛出UnsupportedOperationException() 问 ...
- 44.QT-安装MySQL、测试连接MySQL
在上章学习了42.QT-操作SQLite数据库后,发现MySQL和SQLite的语句都大致相同,所以本章只测试MySQL是否能使用 MySQL安装参考链接:https://blog.csdn.net/ ...
- 用js传递当前页面的url,丢失了&后面的参数 解决办法
问题:因为登陆是用ajax传值的,在哪个页面点击登陆的,登陆成功跳到再跳回那个页面,之前直接传递的是 /index_do.php?gourl=" +location.href这样传递的,但是 ...
- php7深入理解匿名函数和回调函数
匿名函数是没有名称的函数,可以将函数赋值给变量,再调用使用,回调函数是指作为一个参数值传值另外一个函数使用的函数. //匿名函数 没名称的函数 $a=function (){echo "ww ...
- Linux命令详解 三
Linux用户和组的属性与权限本章结构1.用户账号和组账号概述2.用户账号和组账号管理3.查询账号信息4.查看目录或文件的属性5.设置目录或文件的权限6.设置目录或文件的归属 前言在linux中一切都 ...