数据结构算法

2023-05-16

线性表

从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值。空出的位置由最后一个元素填补,若顺序表为空则显示出错信息并退出运行。

​ 算法思想:搜索整个顺序表,查找最小值元素并记住其位置,搜索结束后用最后一个元素填空出的原最小值元素的位置。
bool Del_Min(sqList &L, EleType &value)
{
	//删除顺序表L中最小值元素节点,并通引用性参数value返回其值
	//若删除成功,则返回true;否则返回false
	if(L.length==0)
		return false;					//表空,终止操作返回
	value=L.data[0];					//假定0号元素的值最小
	for(int i=1;i<L.length;i++)		//循环,寻找具有最小值的元素
		if(L.data[i]<value)		//让value记忆当前具有最小值的元素
		{
			Value=L.data[i];
			pos=i;
		}
	L.data[pos]=L.data[L.length-1];	//空出的位置由最后一个元素填补
	L.length--;
	return true;					//	此时,value即为最小值	
}

设计一个高效算法,将顺序表L的所有元素逆置,要求算法的空间复杂度为O(1)。

算法思想:扫描顺序表L的前半部分元素,对于元素L.data[i]0<=i<L.1 ength/2),
将其与后半部分的对应元素L.data[L.1 ength-i-1]进行交换。
void Reverse(Sqlist &L)
{
	Elemtype temp;  	//辅助变量
	for(i=0;i<L.length/2;i++)
	{
		temp=L.data[i];			//交换L.[data]与L.data[L.length-i-1]
		L.data[i]=L.data[L.length-i-1];
		L.data[L.length-i-1]=temp;
	}
} 

对长度为n的顺序表L,编写一个时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法删除线性表中所有值为x的数据元素。

 解法一:用k记录顺序表L中不等于x的元素个数(即需要保存的元素个数),边扫描L边统计k
 并将不等于x的元素向前移动k个位置,最后修改L的长度
void del_x_1(Sqlist &l,Elemtype x)
{
//本算法实现删除顺序表中所有值为x的数据元素
	int k=0;					//记录值不等于x的元素个数
	for(i=0;i<L.length;i++)
		if(L.data[i]!=x)
		{
			L.data[k]=L.data[i];
			k++;				//不等于x的元素增1
		}
		L.length=k;				//顺序表L的长度等于k;
}
解法二:用k记录顺序表L中等于x的元素个数,边扫描L边统计k,并将不等于x的元素前移k个位置,最后修改L的长度。
void del_x_2(Sqlist &l,Elemtype x)
{
	int k=0,i=0;					//k记录值等于x的元素个数
	while(i<L.length)
	{
		if(L.data[i]==x)
			k++;					
		else
			L.data[i-k]=L.data[i];	//当前元素前移k个位置
		i++;
	}
	L.length=L.length-k;			//顺序表L的长度递减
}

从有序顺序表中删除其值在给定值s与t之间(要求s<t)的所有元素,如果s或t不合理或顺序表为空,则显示出错信息并退出运行

注意:本题与上一题的区别。因为是有序表,所以删除的元素必然是相连的整体。
​ 算法思想:先寻找值大于等于s的第一个元素(第一个删除的元素),
然后寻找值大于t的第个元素(最后一个删除的元素的下一个元素),要将这段元素删除,只需直接将后面的元素前移
bool Del_s_t2(SqList &L,ElemType s, ElemType t)
{
	//删除有序表L中值在给定值s与t之间的所有元素
	int i,j;
	if(s>=t||L.length==0)
		return false;
	for(i=0;i<L.length&&L.data[i]<s;i++);//寻找大于等于s的第一个元素
	if(i>=L.length)
		return false;					 //所有元素均小于s,返回
	for(j=i;j<L.length&&L.data[j]<=t;j++)//寻找值大于t的第一个元素
	for(;j<L.length;i++,j++)
		L.data[i]=L.data[j];			 //前移,填补被删除元素位置
	L.length=i;
	return true;
}

从有序顺序表中删除所有其值重复的元素,使表中所有元素的值均不同

算法思想:注意是有序顺序表,值相同的元素一定在连续的位置上,用类似于直接插入排序的思想,
初始时将第一个元素视为非重复的有序表.之后依次判断后面的元素是否与前面非重复有序表的最后一个元素相同,
若相同则继续向后判断,若不同则插入到前面的非重复有序表的最后,直至判断到表尾为止.
bool. Delete Same(SeqList& L){
	if (L.length==0)
		return fals;
	int i,j;					//i存储第一个不相同的元素,j为工作指针
	for (1-0,j=1:j<L, length:j++)
		if(L.data[i]!=L,data[j])	//查找下一个与上个元素值不同的元素
			L.data[++i]=L.data[j];	//找到后,将元素前移
	L.length=i+1;		
	return true;
}

将两个有序顺序表合并为一个新的有序顺序表,并由函数返回结果顺序表。

算法思想:首先,按顺序不断取下两个顺序表表头较小的结点存入新的顺序表中.然后,看哪个表还有剩余,
将剩下的部分加到新的顺序表后面.
注意:本算法的方法非常典型,需牢固掌握.
bool Merga(SeqList A, SeqList B, SeqList &C){
	//将有序顺序表A与B合并为一个新的有序顺序表C 
	if(A.length+B, length>C.maxsize) //大于顺序表的最大长度
		return false; 
	int i=0,j=0, k=0;
	while(i<A.length&&j<B,length){	 //循环,两两比较,小者存入结果表
	if(A.data[i]<=B.data[j])
		C.data[k++]=A.data[i++];
	else 
		C.data[k++]-B.data[j++];
	}
	while(i<A.length)				//还剩一个没有比较完的顺序表while(j<B length)
		C.data[k++]=B.data[j++]
	C.length=k;
	return true;
}

已知在一维数组A[m+n]中依次存放两个线性表(a1,a2,a3,…,am)和(b1,b2,b3,…,bn)。试编写一个函数,将数组中两个顺序表的位置互换,即将(b1,b2,b3,…,bn)放在(a1,a2,a3,…,am)的前面。

算法思想:先分别逆,再整体逆
typedef int DataType;
void Reverse(DataType A[],int left, int right, int arraysize){
	//逆转(a1eft, aleft+1, aleft+2… aright)为( aright, aright-1,…, aleft)
	if (left>=righti lright>=arraysize)
		return 
	int mid=(left+right)/2i 
	for(int 1=0ii<=mid-leftii++){
		Datatype temp=A[left+i]; 
		A[left+i]=A[right-i]; A[right-i]=temp
	}
}
void Exchange(DataType A[, int m, int n, int arraysize){
	/*数组A[m+n]中,从0到m-1存放顺序表(a1,a2,a3,…,am),从m到m+n-1存放顺序表
	(b1,b2,b3…,bn),算法将这两个表的位置互换*/ 
	Reverse(A, 0, m+n-1, arraysize);
	Reverse(A, 0, n-l, arraysize);
	Reverse(A, n, m+n-l, arraysize);
}

线性表(a1a2a,…,an)中的元素递增有序且按顺序存储于计算机内。要求设计一算法,完成用最少时间在表中查找数值为x的元素,若找到则将其与后继元素位置相交换,若找不到则将其插入表中并使表中元素仍递增有序

算法思想:顺序存储的线性表递增有序,可以顺序査找,也可以折半査找.题目要求"用最少的时间在表中查找数值为x的元素",
这里应使用折半查找法
void SearchExchangeInsert(ElemType A[], ElemType x){
	int low=0, high=n-1, mid;		 //1ow和high指向顺序表下界和上界的下标
	while(low<=high){
		mid=(low+high)/2;			 //找中间位置
		if(A[mid]==x) break; 		 //找到x,退出 while循环
		else if(A[mid]<x) low=mid+1; //到中点mid的右半部去查
		else high=mid-1;			 //到中点mid的左半部去查
	}//下面两个if语句只会执行一个
	if(A[mid]==x&&mid!=n-1){		//若最后一个元素与x相等,
									//则不存在与其后继交换的操作
		t=A[mid]; A[mid]=A[mid+l]; A[mid+l]=t;
	}
	if(low>high){					//查找失败,插入数据元素
		for(i=n-1;i>high;i--) A[i+1]=A[i];	//后移元素
		A[i+1]=x;							//插入x
	}										//结束插入
}
本题的算法也可写成三个函数:查找函数、交换后继函数与插入函数.写成三个函数的优点是逻辑清晰、易读.

【2010统考真题】设将n(n>1)个整数存放到一维数组R中。设计一个在时间和空间两方面都尽可能高效的算法。将R中保存的序列循环左移p(0<p<n)个位置,即将R中的数据由(X0,X1…,Xn-1变换为(Xp,Xp+1,…,Xn-1,X0,X1,…,Xp-1).要求:

1)给出算法的基本设计思想

2)根据设计思想,采用C或C艹或Java语言描述算法,关键之处给出注释。

1)算法的基本设计思想:可将这个问题视为把数组ab转换成数组ba(a代表数组的前p个元素,b代表数组中余下的n-p个元素),
先将a逆置,再将b逆置,最后将整个逆置得到ba.
设 Reverse函数执行将数组元素逆置的操作,对abcdefgh向左循环移动3(p=3)个位置的过程如下:
Reverse(0,p-1)得到 cbadefgh

Reverse(p,n-1)得到 cbahgfed

Reverse(0,n-1)得到 defghabc;: Reverse中,两个参数分别表示数组中待转换元素的始末位置
2)使用C语言描述算法如下:
void Reverse (int RU, int from, int to){
	for(i=0; i<(to-from +1)/2;i++)
		{temp=R[from+i];R[from+i]=R[to-il;R[to-i]=temp;}
} 
void Converse(int R[], int n, int p){
	Reverse(R,0, p-1);
	Reverse(R,p, n-1);
 	Reverse(R,0, n-1);
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构算法 的相关文章

  • 数据结构算法

    线性表 从顺序表中删除具有最小值的元素 xff08 假设唯一 xff09 并由函数返回被删元素的值 空出的位置由最后一个元素填补 xff0c 若顺序表为空则显示出错信息并退出运行 算法思想 xff1a 搜索整个顺序表 xff0c 查找最小值
  • 数据结构-二叉排序树(图文详细版)

    文章目录 前言 一 二分搜索树的特性 1 中序遍历的序列是递增的序列 2 中序遍历的下一个节点 称后继节点 即比当前节点大的最小节点 3 中序遍历的前一个节点 称前驱节点 即比当前节点小的最大节点 二 添加节点 1 思路 2 代码实现 三
  • 数据结构与算法:去除重复字母

    给你一个仅包含小写字母的字符串 请你去除字符串中重复的字母 使得每个字母只出现一次 需保证返回结果的字典序最小 要求不能打乱其他字符的相对位置 示例 1 输入 bcabc 输出 abc 示例 2 输入 cbacdcbc 输出 acdb 解题
  • 单链表实现(C++)

    C 实现单链表数据结构 myList h ifndef MYLIST H define MYLIST H typedef struct node int data struct node next Node class myList pub
  • 数据结构-判断平衡二叉树(java)

    判断平衡二叉树 题目 力扣110题 解题思路 1 首先理解平衡二叉树的定义 使用Map存储每个节点的高度 2 求得当前节点的左右子树高度 若Map中左右子树高度已经求过 直接取得 若没有 通过递归计算高度并存入Map中 3 左右子树高度差
  • 【STL详解】stack

    文章目录 前言 一 STL 二 stack 1 stack的创建 2 stack相关方法 3 如何对satck进行排序 前言 本篇文章将总结SLT stack 以及其常用方法 一 STL STL 是 Standard Template Li
  • 数据结构-二分搜索树转双向链表(Java)

    二分搜索树转双向链表 牛客JZ36 题目 思路 1 对二分搜索树进行中序遍历 2 将二分搜索树左节点和根节点相连接 右节点和根节点相连接 遍历左子树 连接 左子树尾部不为空 leftTail right pRootOfTree pRootO
  • 【通俗易懂-动态图解析】归并排序、计数排序

    编程TWO 编程小兔崽 今天 归并排序 和选择排序一样 归并排序的性能不受输入数据的影响 但表现比选择排序好的多 因为始终都是O n log n 的时间复杂度 代价是需要额外的内存空间 归并排序是建立在归并操作上的一种有效的排序算法 该算法
  • 数据结构与算法:线索二叉树

    线索二叉树 线索二叉树原理 首先我们要来看看这空指针有多少个呢 对于一个有n个结点的二叉链表 每个结点有指向左右孩子的两个指针域 所以一共是2n个指针域 而n个结点的二叉树一共有n 1条分支线数 也就是说 其实是存在2n n 1 n 1个空
  • 数据结构—判断一棵二叉树是否是完全二叉树(java)

    判断一棵二叉树是否是完全二叉树 一 完全二叉树的三种节点 完全二叉树有右树必有左树 节点编号和满二叉树一一对应 1 度为2的节点有n个 2 度为1的节点只能有1个 3 度为0的节点有n个 二 具体思路 1 分两个阶段 第一阶段所有节点都有左
  • 数据结构和算法(二)

    ArrayList 和LinkedList原理 代码实现 性能区别 1 ArrayList 为什么查询快 数组和集合区别 动态大小 数组的长度是固定的 ArrayList 数组集合 内部使用数组实现的 自定义ArrayList 如下 pub
  • 二叉树-判断另一棵树的子树(Java)

    另一棵的子树 力扣572题 题目 给你两棵二叉树 root 和 subRoot 检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树 如果存在 返回 true 否则 返回 false 二叉树 tree 的一棵子树包括 t
  • 二叉查找树实现

    package leetcode May import java util ArrayList import java util List description 二叉查找树 author qiangyuecheng date 2022 5
  • 删除链表元素详解版(Java)

    目录 题目 1 一般方法 2 虚拟头节点法 3 递归法 题目 Leetcode203题 移除链表元素 给你一个链表的头节点 head 和一个整数 val 请你删除链表中所有满足 Node val val 的节点 并返回 新的头节点 1 一般
  • 最小生成树总结1 prim算法

    最小生成树总结1 prim算法 最小生成树总结2 kurskal算法 文章目录 1 最小生成树问题概述 2 Prim算法流程 3 模板 4 板子题 1 最小生成树问题概述 给定带权节点网络 从中确定一个包含所有节点 n个 n 1条边 所有节
  • 递推典型算法:猴子爬山,跳台阶,爬楼梯(牛客网)、魔法深渊(快手)----Python、Java

    递推算法的基本思想是把一个复杂的 庞大的计算过程转化为简单过程的多次重复 其首要问题是得到相邻的数据项之间的关系 即递推关系 以猴子爬山为例 1 问题的提出 一个顽猴在一座有30级太假的小山上爬山活跃 猴子上一步可跳1级或者3级 试求上山的
  • 七大经典排序算法总结【详解】

    排序算法的分类 插入排序 选择排序 交换排序 归并排序 具体分类如图所示 这七种排序算法在我们生活中应用非常广泛 所用的场景各有不同 他的时间复杂度和空间复杂度也是不同的 一 插入排序 初始数据越接近有序 时间效率越高 1 直接插入排序 直
  • 排列数组使得偶数在奇数的前面

    Name ReorderOddEven c Author 齐保元 Version Copyright Your copyright notice Description Hello World in C Ansi style include
  • LSM详解

    关于LSM结构的相关介绍 这篇文章比较好 特此纪录一下https yq aliyun com articles 767772
  • ConcurrentHashMap源码解读

    曾经研究过jkd1 5新特性 其中ConcurrentHashMap就是其中之一 其特点 效率比Hashtable高 并发性比hashmap好 结合了两者的特点 集合是编程中最常用的数据结构 而谈到并发 几乎总是离不开集合这类高级数据结构的

随机推荐

  • IPTABLES

    IPTABLES 题目 IspSrv RouterSrv 提示 如果需要全套视频以及笔记请私信我 视频可能需要额外收点费用 题目 服务器 IspSrv 工作任务 IPTABLES 修改 INPUT 和 FORWARD 链默认规则为 DROP
  • CA根证书搭建

    CA根证书搭建 题目 一 安装openssl 二 建立根证书存放目录 创建目录及文件 生成证书 使用私钥进行签名 提示 如果需要全套视频以及笔记请私信我 视频可能需要额外收点费用 题目 CA 证书颁发机构 CA 根证书路径 csk root
  • btrfs问题记录

    记录btrfs 文件系统问题 问题记录 今天在运维工作中遇到一个问题 期初是用户报MQ软件无法使用了 检查时发现MQ的是安装过的 xff0c 但是原本应该有mq安装后文件的 opt目录下空的 问题环境是一个suse12 的 xff0c 根目
  • pure-ftpd

    pure ftpd 题目 一 安装pure ftpd 二 建立用户 三 建立软连接 允许虚拟用户登录 四 重启服务 五 查看监听端口 六 关于 Pure FTPd 的配置文件 七 启用 FTPES 八 登录后限制在自己的根目录 九 ftpu
  • 互联网访问检测服务器

    互联网访问检测服务器 题目 一 搭建服务 二 配置DNS服务 三 搭建DHCP 可有可无 四 配置IIS 五 客户端配置 提示 若需要单独全套笔记可私信我咨询 题目 互联网访问检测服务器 为了模拟Internet 访问测试 请搭建网卡互联网
  • 2019年SDN软件定义网络部分

    SDN 题目 二 配置IP添加网卡以及karaf程序启动 三 创建拓扑 四 打开网页查看拓扑 五 通过OVS手动添加网卡 设置网关 1 添加网卡 2 设置网关地址 开启路由转发 3 给H1 H2 H3 H4设置网关 六 OVS手工下发流表
  • Centos DHCP

    DHCP配置 题目 一 关闭Selinux跟防火墙 二 安装dhcp 并启动 三 编辑和配置dhcp 四 分离日志 四 启动dhcp服务和日志 五 中继 六 客户端测试 提示 有任何问题可以私信我 下班看到第一时间回复 题目 DHCP 为I
  • Uos统信系统 IP地址以及完整主机名配置

    UOS IP地址以及完整主机名配置 提示 有任何问题可以私信我 下班看到第一时间回复 IP地址以及主机名配置 UOS IP地址以及完整主机名配置 一 修改配置文件并重启 首先先查看自己网卡名 保存重启网卡并查看 二 配置主机域名 完整域名
  • dns安全策略

    dns安全策略 题目 一 配置策略并应用 powershell操作设置 提示 有任何问题私聊我 题目 DNS 拓扑中所有主机的DNS查询请求都应由IspSrv进行解析 配置DNS安全策略 限制DNS查询请求每秒只允许10个查询 一 配置策略
  • SSTP+NPS

    L2T NPS 题目 一 安装证书服务和nps配置 1 证书 2 NPS 二 安装路由远程访问服务和配置证书 三 测试 本教程只用于学习禁止任何违法行为后果自负 提示 有任何问题私聊我 题目 虚拟专用网络 配置SSTP VPN 证书由CSK
  • Windows磁盘管理(虚拟磁盘)

    磁盘管理 题目 一 添加磁盘 二 创建虚拟磁盘 三 格式磁盘 提示 若需要问题欢迎私聊 题目 磁盘管理 添加相应的磁盘 创建一个500TB 的虚拟磁盘 格式化相应的空间用作iSCSI 存储盘 卷标D 命名为iSCSI 一 添加磁盘 二 创建
  • Windows iSCSI

    iSCSI 题目 一 安装iSCSI并创建存储位置 二 配置iSCSI 三 DC1连接iSCSI 四 创建盘 提示 若需要问题欢迎私聊 题目 iSCSI 磁盘存储在D ISCSIDATA 中 iSCSI 磁盘提供给DC1 使用 磁盘容量50
  • 2022年全国网络系统管理赛项正式题A模块交换路由和隧道详细配置

    2022年全国网络系统管理赛项正式题A模块交换路由和隧道讲解 文章目录 2022年全国网络系统管理赛项正式题A模块交换路由和隧道讲解 拓扑 一 基础配置 二 有线网络配置 总结 拓扑 一 基础配置 1 根据附录 1拓扑图 附录 2地址规划表
  • ubuntu登录到root用户及退出

    方式1 xff1a sudo su 然后输入当前用户名密码 进入登录root账号之前用户所在的目录 方式2 xff1a sudo i 然后输入当前用户名密码 进入到 root目录 方式3 xff1a su root 输入密码 进入登录roo
  • linux display命令,用ImageMagick工具的display命令和fim命令从命令行查看图像

    本文介绍从Linux命令行 终端 查看图像的方法 xff0c 可使用ImageMagick工具的display命令 xff0c 还有fim命令 xff0c 包含使用display命令和fim命令的实例 前言 Linux有许多用于查看图像的G
  • AJAX实现跨域之Access control allow origin

    AJAX实现跨域之Access control allow origin直接在你的跨域服务器上面写上以下两行代码即可 xff1a response setHeader 34 Access Control Allow Origin 34 34
  • 关于新手创建Maven项目时,如何解决junit版本号标红

    今天用ide创建Maven项目时 xff0c pom里面的junit依赖的版本号出现标红 即版本号错误 xff09 xff0c 如下图 xff1a 找到本地仓库 xff0c 一般为 m2 repository xff0c 我的是C User
  • Debian虚拟机安装常用软件

    1 VMware 安装Debian 默认都安装完了 xff0c 尽量别联网 xff0c 联网因为Debian安装时从网上下东西 xff0c 导致安装非常慢 xff01 2 安装VMWare Tools VMWare虚拟机菜单 xff0c 安
  • java cell自动适应内容_POI cell的宽度自适应

    POI是apache提供的一个读写Excel文档的开源组件 xff0c 在操作excel时常要合并单元格 xff0c 合并单元格的方法是 xff1a sheet addMergedRegion new CellRangeAddress 1
  • 数据结构算法

    线性表 从顺序表中删除具有最小值的元素 xff08 假设唯一 xff09 并由函数返回被删元素的值 空出的位置由最后一个元素填补 xff0c 若顺序表为空则显示出错信息并退出运行 算法思想 xff1a 搜索整个顺序表 xff0c 查找最小值