【笔记】数据结构笔记02

news2024/9/21 23:45:51

@toc

前话

算法学习网站:

itcharge
代码随想录
labuladong

参考严蔚敏数据结构

树与等价问题

typedef PTree MFSet;
	//查找算法

int find_mfset(MFSet S,int i){
	if(i<1||i>S.n) return -1;//i不属于任一集合
	for(j=i;S.nodes[j].parent>0;j=nodes[j].parents);
	return j;
}
//归并算法
Status merge_mfset(MFSet &S,int i,int j){
//S.node[i]和S.node[j]分别为S的互不相交的两个子集Si和Sj的根结点。
//求并集Si∪Sj
	if(i<1||i>S.n||j<1||j>S.n)return ERROR;
	S.node[i].parent=j;
	return OK;
}//merge_mfset

void mix_mfset(MFSet &S,int i,int j){
	if(i<1||i>S.n||j<1||j>S.n)return ERROR;
	if(S.nodes[i].parent>S.nodes[j].parent){
		S.nodes[j].parent+=S.nodes[i].parent;
		S.nodes[i].parent=j;
	}else{
		S[nodes[i].parent+=S.nodes[j].parent;
		S.nodes[j].parent=i;
	}
	return OK;
}
/
int fix_mfset(MFSet &S,int i){
	if(i<1||i>S.n)return -1;
	for(j=i;S.nodes[j].parent>0;j=S.nodes[j].parent);
	for(k=i;k!=j;k=t){
		t=S.nodes[k].parent;
		S.nodes[k].parent=j;
	}//进行路径压缩 将所有从根到元素i路径上元素都变成树根的孩子;
	return j;
}

赫夫曼树 p144

赫夫曼树没有度为1的结点,一棵有n个叶子结点的赫夫曼树共有2n-1个结点。可以存储在一个大小为2n-1的一维数组当中。
构成赫夫曼树后,
【求编码】:需从叶子结点出发走一条从叶子到根的路径。
【译码】:从根节点到叶子节点出发走
需知双亲信息孩子信息

结构
typedef struct{
	unsigned int weight;//权值不能为负?
	unsigned int parent,lchild,rchild;
}HTNode,*HuffmanCode;//动态分配数组存储赫夫曼树;
typedef char ** HuffmanCode;//动态分配存储赫夫曼树编码表;
算法
void HuffmanCoding(HuffmanTree& HT,HuffmanCode& HC,int *w,int n){
//w存放n个字符的权值(均>0),构造赫夫曼树HT,并求出n个字符的赫夫曼编码HC
	if(n<=1)return ;
	int m=2*n-1;//哈夫曼树一共拥有的节点。
	HT = (HuffmanTree)malloc((m+1)*sizeof(HTNode));
	//0号单元未用
	
	for(p=HT,i=1;i<=n;++i,++p,++w)
		*p={*w,0,0,0};//先将每个权值存放进前n个
	
	for(;i<m;++i;++p)*p={0,0,0,0};//后面的结点全部赋值为0
	for(i=n+1;i<=m;++i){//遍历子节点。
		Select(HT,i-1,s1,s2);
		//在HT[1...i-1]选择parent为0且weight最小的两个结点,
		//其序号分别为s1,s2.
		HT[s1].parent=i;
		HT[s2].parent=i;
		
		HT[i].lchild=s1;
		HT[i].rchild=s2;
		
		HT[i].weight=HT[s1].weight+HT[s2].weight;
	}
	//进行构建哈夫曼树
	
		HC=(HuffmanCode)malloc((n+1)*sizeof(char*));
		//分配n个字符编码的头指针向量。
		cd=(char*) malloc(n*sizeof(char));
		//分配求编码的工作空间。
		cd[n-1]="\0";
		//编码结束符
		
		for(i=1;i<=n;++i){
		//逐个字符求赫夫曼编码
			start=n-1;//编码结束位置
				
			for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)
			//求编码  从【叶子】到【根】逆向遍历
				if(HT[f].lchild==c)cd[--start]="0";
				else cd[--start]="1";
			
			HC[i]=(char*) malloc((n-start)*sizeof(char));
			//为第i个字符编码分配空间
			strcpy(HC[i],&cd[start]);
			//从cd复制编码(串)到HC
			
		}
		free(cd);//释放工作空间
}//HuffmanCoding

无栈非递归遍历赫夫曼树,求赫夫曼编码

HC=(HuffmanCode)malloc((n+1)*sizeof(char*));
p=m,cdlen=0;
for(i=1;i<=m;++i)HT[i].weight=0;
//遍历赫夫曼树时用作结点状态标志;
while(p){
	if(HT[p].weight==0){//向左
		HT[p].weight=1;
		if(HT[p].lchild!=0){
			p=HT[p].lchild;
			cd[cdlen++]="0";
		}else if(HT[p].rchild==0){
			//登记叶子结点的字符编码;
			HC[p]=(char*)malloc((cdlen+1)*sizeof(char));
			cd[cdlen]="\0";
			strcpy(HC[p],cd);
			//复制编码(串)
		}
	}//endif
	else if{//向右
		HT[p].weight=2;
		if(HT[p].rchild!=0){
			p=HT[p].rchild;
			cd[cdlen++]="1";
		}
	}else{//HT[p].weight==2 退回
		HT[p].weight=0;
		p=HT[p].parent;
		--cdlen;//退到父结点,编码长度减一;
	}
}//while

求幂集元素过程

(1)集合
提示:集合的幂集就是集合A的所有子集所组成的集合。

题目:要求求n个元素的集合的幂集!
假设这里有三个元素:A={1,2,3},那么集合A的幂集?
ρ(A)={{1,2,3},{1,2},{1,3},{1},{2,3},{2},{3},Φ}
如下图所示:

在这里插入图片描述

参考
Keep_Trying_Go

求解集合的幂集

提示:求解ρ(A)集合的过程可以看成是依次对集合A中元素进行“取”或者“舍(弃)”的过程,通过上面也可以看到是一棵二叉树来表示幂集元素的状态变化状况。

在这里插入图片描述

过程:

  • 树中的根节点表示幂集元素的初始状态(为空集);
  • 叶子节点表示它的终结状态中幂集ρ(A)的8个元素;
  • 第i层(i=1,2,3,…,n)层的分支节点,则表示已对集合A中前i-1个元素进行了取/舍处理的当前状态(其中左分支表示“取”,右分支表示“舍”);
  • 将上述问题求解集合的幂集转换为先序遍历这棵状态树的过程。
//算法描述
void Powerset(int i,int n){
	//初始调用:Powerset(1,n)
	if(i>n){
		输出幂集的其中一个元素 
	}else{
		取第i个元素
		Powerset(i+1,n);
		舍第i个元素 
		Powerset(i+1,n);
	}
} 
void GetPowerSet(int i,List A,List &B){
	if(i>ListLength(A))	Output(B);
	else {
		GetElem(A,1,x);
 		int k=ListLength(B);
        ListInsert(B,k+1,x);
        GetPowerset(i+1,A,B);
 
        ListDelete(B,k+1,x);
        GetPowerset(i+1,A,B);

	}
}
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
 
#define maxn 10
 
//使用数组set表示集合
int set[maxn];
//使用辅助数组auxset表示取和舍的过程
int auxset[maxn];
 
void init(int n){
	for(int i=0;i<n;i++){
		set[i]=0;
		auxset[i]=0;
	} 
}
 
void Powerset(int i,int n){
//核心算法
	if(i>n){
		for(int j=0;j<i-1;j++){
			printf("%d  ",auxset[j]);
		}
		printf("\n");
	}else{
		auxset[i-1]=set[i-1];//进入左子树 取
		Powerset(i+1,n);
		auxset[i-1]=0;//进入右子树 舍
		Powerset(i+1,n);
	}
}
 
 
int main(){
	int n;
	printf("请输入集合的元素个数: ");
	scanf("%d",&n);
	init(n);
	printf("请输入元素: ");
	for(int i=0;i<n;i++){
		scanf("%d",&set[i]);
	}
	Powerset(1,n);
	return 0;
}
 

图没有顺序映像的存储结构,可以借助数组的数据类型表示元素之间的关系
用多重链表表示图是自然的事情。
两个数组分别存储数据元素(顶点)信息和数据元素的关系(边或弧)的信息

typedef enum{DG,DN,UDG,UDN}GraphKind;
//{有向图,有向网,无向图,无向网}
typedef struct ArcCell{
	VRType adj;
	//VRType 是顶点关系类型。对无权图,用1或0
	//表示相邻否,对带权图,则为权值类型
	InfoType *info;
	//该弧相关信息的指针
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct{
	VertexType vexs[MAX_VERTEX_NUM];//顶点向量
	AdjMatrix arcs;//邻接矩阵
	int vexnum,arcnum;//图的当前顶点数和弧数
}MGraph

有向无环图

有向树,DAG图和有向图

检查有向图是否存在环比无向图复杂,
对于无向图来说,若深度优先遍历过程遇到回边(指向已访问过的顶点的边),则必定存在环。
对于有向图来说,这条回边有可能是指向深度优先生成森林中另一颗生成树上顶点的弧

有向图[关键路径和拓扑排序]

拓扑排序

集合上

偏序的定义:设R是集合A上的一个二元关系,若R满足:
Ⅰ 自反性:对任意x∈A,有xRx;
Ⅱ 反对称性(即反对称关系):对任意x,y∈A,若xRy,且yRx,则x=y;
Ⅲ 传递性:对任意x, y,z∈A,若xRy,且yRz,则xRz。 则称R为A上的偏序关系。

全序:对每个x,y都有xRy或yRx,则可以称R是集合X上的全序关系。

全序:拓扑有序
偏序定义得到拓扑有序的操作是拓扑排序

动态存储管理

结构中的每个数据元素都占有一定的内存位置。数据元素的存取是通过对应的存储单元来进行的。

有了【高级语言】之后,程序员不需要直接和内存地址打交道,程序中使用的存储单元都由逻辑变量(标识符)表示。它们对应的内存地址都是由编译程序在【时期 :编译或执行时】进行分配。

每个用户程序使用的内存由【操作对象:操作系统】进行分配,总的内存不够使用的时候可以采用自动覆盖技术。

编译程序中一个/几个字,在系统中几千,几万甚至是几十万。系统每次分配给用户的都是地址连续的内存区。

低地址:若干占用块
高地址:空闲块(堆)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2084984.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用宝塔部署项目到阿里云服务器访问不到的问题

今天用宝塔部署项目到阿里云&#xff0c;开始前端部署到了80端口&#xff0c;能正常访问&#xff0c;后端部署到了8081&#xff0c;但是后端接口一直无响应&#xff0c;最后超时。 但是java正常运行 系统防火墙的状态正常&#xff0c;策略也是放行 阿里云安全组也已经配置了 …

【性能优化】:从理论中来到实践中去(三)

本文主要介绍真实代码实现 序言 根据前面两篇文章的梳理 【性能优化】&#xff1a;探索系统瓶颈的根源&#xff08;一&#xff09; 【性能优化】&#xff1a;设计模式与技术方案解析&#xff08;二&#xff09; 我们已经知道了自动化跑批系统的核心功能&#xff0c;今天就来真…

如何使用混合搜索实现更好的 LLM RAG 检索

通过结合密集嵌入和BM25构建高级本地LLM RAG管道 基本的检索增强生成&#xff08;RAG&#xff09;管道使用编码器模型在给定查询时搜索相似文档。 这也被称为语义搜索&#xff0c;因为编码器将文本转换为高维向量表示&#xff08;称为嵌入&#xff09;&#xff0c;在该表示中&…

【计算机组成原理】汇总五、中央处理器

五、中央处理器 文章目录 五、中央处理器1.CPU的功能与结构1.1CPU功能1.2运算器1.2.1基本结构1.2.2 ALU和寄存器的数据通路 1.3控制器1.3.1基本结构1.3.2控制器功能 1.4CPU的基本结构 2.指令执行过程2.1指令周期2.2指令周期流程2.3数据流2.4指令执行方案&#xff1a;如何安排多…

Type-C接口诱骗取电快充方案

Type-C XSP08Q 快充协议芯片是一种新型电源管理芯片&#xff0c;主要负责控制充电电流和电压等相关参数&#xff0c;从而实现快速充电功能。Type-C XSP08Q快充协议是在Type-C接口基础上&#xff0c;加入了XSP08Q协议芯片的支持&#xff0c;很大程度上提升了充电速度。 正常情况…

ConcurrentHashMap扩容原理 | 存储流程 | 源码探究

新人写手&#xff0c;代码菜鸡&#xff1b;笔下生涩&#xff0c;诚惶诚恐。 初试锋芒&#xff0c;尚显青涩&#xff1b;望君指点&#xff0c;愿受教诲。 本篇文章将从源码的层面&#xff0c;探讨ConcurrentHashMap的存储流程以及扩容原理 Java版本为JDK17&#xff0c;源代码可…

Ollama 本地部署

文章目录 前言一、Ollama是什么&#xff1f;二、使用步骤1.安装 OllamaWindows检验是否安装成功 2.运行ollama 模型库运行模型提问修改配置&#xff08;可选&#xff09;如果有个性化需求&#xff0c;需要修改默认配置&#xff1a; 参考 前言 Ollama是一个易于使用的本地大模型…

LivePortraitV3,支持图像驱动和区域控制,更精确的人像控制(WIN,MAC)

LivePortrait又又又又更新了&#xff01;这速度真是&#x1f44d;&#x1f3fb;&#x1f44d;&#x1f3fb; 【LivePortraitV3&#xff0c;支持图像驱动和区域控制&#xff0c;更精确的人像控制&#xff08;WIN&#xff0c;MAC&#xff09;】 https://www.bilibili.com/video/…

别暑气 迎秋意

今年长达40天的“三伏”结束啦&#xff01; 伏天过后&#xff0c;暑热逐渐消退&#xff0c;天气开始转凉&#xff0c;秋季逐渐来临。我们也该调整好生活节奏&#xff0c;去迎接收获季节的开始。 1、注意防寒保暖 天气逐渐转凉&#xff0c;昼夜温差不断增大&#xff0c;所以要…

Pytest自动化测试框架关联/参数化实战

关联 利用Python提供的fixture可以实现关联 实现步骤&#xff1a; 在case目录下&#xff0c;新建conftest.py文件&#xff0c;比如我们需要token&#xff0c;就在这个文件下定义一个公共的方法&#xff0c;调用登录接口并返回需要的token值&#xff08;注&#xff1a;公共的方…

【乐企】有关乐企能力测试接口对接-货物运输服务(详细)

1、前置条件&#xff0c;参考【乐企】有关乐企能力测试接口对接-基础版&#xff08;详细&#xff09; 2、接口文档 和基础版区别&#xff1a; 1、传参的时候添加了 用例编码&#xff1a;ylbm 2、发票上传接口的服务编码变化了&#xff1a;fwbm:HWYSFPSC 3、能力编码和用例编码…

Linux——安装软件(mysql)

一、应用部署&#xff1a; 安装软件 运行某个程序或者服务 安装软件包 dnf/yum 包安装工具官方网站提供的集成软件包源码编译安装 // 源码编译的步骤 只应用于编译型语言 对于解释性语言编写的程序 采用不用的方式打包 编译型语言编写的程序&#xff1a; nginx解释性语言…

Verilog刷题笔记63

找BUG 1、&#xff1a;Bug mux2 挑错&#xff1a; module top_module (input sel,input [7:0] a,input [7:0] b,output [7:0]out );assign out sel?a:b;endmodule结果正确&#xff1a; 原因: 1、输出out也应为8位 2、逻辑错误&#xff0c;&按位操作&#xff0c;需要将…

【可兼容的】protobuf、streamlit、transformers、icetk、cpm_kernels版本号

搞大模型训练的工作不可避免地需要很多库&#xff0c;但是非常讨厌的事情是这些库动不动就不兼容。最近在做文本分类训练的时候又遇到了这个问题&#xff0c;为了避免后面再安装包的时候把我之前的环境破坏了&#xff0c;所以特地来记录一下&#xff1a;protobuf、streamlit、t…

GD32F4xx---RTC初始化设置及闹钟方式实现秒中断讲解

GD32F4xx—RTC初始化设置及闹钟方式实现秒中断讲解 1、下载链接:源码工程 一、概述 GD32F4x的RTC例程网上资源较少,详细阅读用户手册后做出如下配置。RTC模块提供了一个包含日期(年/月/日)和时间(时/分/秒/亚秒)的日历功能。除亚秒用二进制码显示外,时间和日期都以BC…

欧科云链: Web3浪潮下合规是“必选项”, 技术创新成发展重点

如果说2023年将是Web3的监管与合规之年。那么2024年就是Web3发展里程碑之年。 自2023年&#xff0c;包括美国、日本、新加坡、迪拜、中国香港等全球多个国家和地区金融中心都先后宣布要成为Web3中心、虚拟资产中心&#xff0c;并努力在监管框架下推动Web3生态的技术创新。 放…

对新手的现货白银交易建议

近期现货白银价格表现十分不错&#xff0c;连续的上涨已经突破了30关口&#xff0c;这是一个重要的心理关口&#xff0c;受投资行情的吸引&#xff0c;很多新手现货白银交易者入场。那么&#xff0c;有没有一些对这些新手投资者的现货白银交易建议呢&#xff1f;下面我们就来讨…

通过Docker部署Nacos,以及Docker Desktop进行管理

目录 一.不需要持久化存储 1.启动容器 2.查看容器和镜像​ 3.容器管理 二.持久化存储启动mysql容器 1.创建docker卷 2.运行容器,指定卷 3.在nacos里面随便建个配置文件 4.停止并删除nacos容器 5.重新运行容器,并且挂载相同的卷,也就是上面第二步的命令 6.打开nacos并…

redis的紧凑列表ziplist、quicklist、listpack

文章目录 前言一、ziplist1.1 ziplist 查找复杂度高1.2 ziplist 连续更新风险 二、quicklist三、listpack 前言 当数据量较小时&#xff0c;Redis 会优先考虑用 ziplist 来存储 hash、list、zset&#xff0c;这么做可以有效的节省内存空间&#xff0c;因为 ziplist 是一块连续…

2024年用哪个思维导图软件好?这款在线工具堪称国产之光!

思维导图软件哪个好&#xff1f; 如今已经是2024年了&#xff0c;想做思维导图&#xff0c;面对琳琅满目的思维导图软件&#xff0c;哪一个才是最适合我们的呢&#xff1f; 在选用思维导图软件时&#xff0c;我们可能会综合考虑多个方面&#xff0c;譬如功能数量、操作易用性…