数据结构经典算法总复习(上卷)
第一章:数据结构导论
无重要考点,仅需了解时间复杂度。
第二章:线性表
1.获得线性表第i个元素
void GetElem_sq(SqList L, int i, ElemType &e) {if (i<1 || i>L.length) ErrorMsg("Invalid i value");
//注意错误监测e = L.elem[i-1];//特别注意:C语言数组下标从0开始,与线性表的位序差1
}
2.求两个顺序表的并集
void Union_sq(SqList &La, SqList &Lb) {Increment(La, Lb.length);for (int i=0; i<Lb.length; ++i) {ElemType e = Lb.elem[i];int j = 0;while(j<La.length && La.elem[j]!=e) ++j;if (j==La.length) {La.elem[La.length++] = e;}}delete []Lb.elem;Lb.length = Lb.listsize = 0;
}
3.求两个单链表的并集
void Union_L(LinkList &La, LinkList &Lb) {LNode *pa = La;while (Lb) {LNode *s = Lb; Lb = Lb->next;//从Lb中依次抽取出s结点LNode *p = pa;while (p && p->data != s->data) {//与La中结点p依次比对p = p->next;}if (p) delete s;else {s->next = La; La = s;}//如果没有,则在La表头添加s}
}
置为(an, an−1, ..., a2, a1)
void Element_Invert(SqList &L)
{int len=L.length;Elemtype tmp;int i;for(i=0;i<len/2;i++)//简单的前后互换{tmp=L.elem[i];L.elem[i]=L.elem[len-i-1];L.elem[len-i-1]=tmp;}
} 5.循环链表的查找元素
LNode* LocateElem_L3(LinkList L, ElemType e) {LNode *p = L->next;while (p != L && p->data != e) p = p->next;return p == L ? NULL : p;//转了一圈回头了,说明没找到
}
6.双向链表插入元素
void ListInsert_DL(DLinkList &L, DLNode *p, DLNode *s) {//s插入到链表中p的前面s->prior = p->prior;s->next = p;//先把s插好p->prior->next = s;p->prior = s;//再去动p结点
}
已知线性表用顺序存储结构表示,表中数据元素为 n 个正整数,试写一个算法,分离该表中的奇数和偶数,使得所有奇数集中放在左侧,偶数集中放在右侧,要求不借用辅助数组且时间复杂度为
7.第一个顺序表实现,较为简单
void Element_EvenOdd(SqList &L)//哨兵思想,左右相合,有点快速排序那味了
{int left=0,right=L.length -1,tmp;while(left<right){while(L.elem[left]%2==1) //为 奇 数{left++;}while(L.elem[right]%2==0) //为 偶 数{right --;}tmp=L.elem[left];L.elem[left]=L.elem[right];L.elem[right]=tmp;}
} 8.第二个链表实现,如果存在头指针,则无需考虑第一个插入的特殊情况。
void oddEvenList(Linklist& L) {//没有头指针的情况if (!L ||!L->next) return;LNode *oddHead=NULL;LNode *oddTail=NULL;LNode *evenHead=NULL;LNode *evenTail=NULL;LNode *curr=L;while (curr) {if (curr->val % 2 == 1) {if (!oddHead) {//此时需要考虑第一个奇的情况oddHead=curr;oddTail=curr;} else {oddTail ->next=curr;oddTail=oddTail ->next;//更新odd链表的尾指针}} else {if (!evenHead) {//需要考虑第一个偶的情况evenHead=curr;evenTail=curr;} else {evenTail ->next=curr;evenTail=evenTail ->next;//更新even链表的尾指针}}curr=curr->next;}if (oddHead) {oddTail ->next=evenHead;//存在奇数的话,奇数表尾连接偶数表头if (evenTail) {evenTail ->next=NULL;//如果存在偶数的话,偶数表尾置空;如果不存在,本身就是空表尾}L=oddHead;} else {L=evenHead;//如果不存在奇数,则链表头为even链表的表头}
}
第三章:栈和队列
bool judgechar(Sqstack &s,char *p) {char e;while(*p!='@'&& *p!='#'){//将@前内容入栈push(s,*p);p++;}if(*p=='#') return FALSE;//若没有@则报Falsep++;while(*p!='#'){if(pop(s,e)&&e==*p) p++;//依次比较且出栈,即@前的和@后的依次抵消else return FALSE;}if(Stackempty(s)) return TRUE;//都抵消了,则对了else return FALSE;
} 2.数制转换问题,从N进制转为d进制。
void conversion(int N, int d) {if (N<=0 || d<=0) ErrorMsg("Input error");Stack S; InitStack(S);while (N) { Push(S, N%d); N = N/d; }//先除的余数,先入栈int e;while (Pop(S, e)) { cout << e; }//后出栈cout << endl;
}
void getsuffix(char exp[],char suffix[]) {SqStack S;InitStack_sq(S,10);//随手输一个10Push_sq(S,'#');//开头的符号char *p=exp;char c,ch;int k=0;while(!StackEmpty(S){ch=p++;if(!isoperator(ch)){//判断是否为符号suffix[k++]=ch;//不为符号,直接写入表达式continue;}switch(ch){//若为符号case '(':Push_sq(S,ch);break;case ')'://若为反括号,则一直取出,直到出现正括号while(Pop_sq(S,c)&&c!='(') suffix[k++]=c;break;default:while(GetTop_sq(S,c) && preop(c,ch))
//判断c(前)和ch(后)优先级,c>=ch则为true{suffix[k++]=c;Pop_sq(S,c);}if(ch!='#') push(S,ch);break;}}suffix[k]='\0';DestoryStack_sq(S);
} 4.求顺序队列的长度
int QueueLength_sq(SqQueue Q) {
//当Q.rear=Q.front时为空队列
//当Q.front-Q.rear=1时为满队列return (Q.rear - Q.front + Q.queuesize) % Q.queuesize;
}
5.顺序队列的入队和出队
void EnQueue_sq(SqQueue &Q, ElemType e) {if ((Q.rear+1) % Q.queuesize == Q.front) Increment(Q);//已为满Q.elem[Q.rear] = e; Q.rear = (Q.rear+1) % Q.queuesize;
}bool DeQueue_sq(SqQueue &Q, ElemType &e) {if (Q.front == Q.rear) return false;//已为空e = Q.elem[Q.front]; Q.front = (Q.front+1) % Q.queuesize;return true;
} 6.汉诺塔问题
void hanoi(int n, char x, char y, char z) {if (n==1) move(x,1,z);//跳出递归条件,即最简问题,将1个盘子由X移到Zelse {hanoi(n-1, x, z, y);//将n-1个盘子由X移到Ymove(x,n,z);//将盘子n由X移到Zhanoi(n-1, y, x, z);//将n-1个盘子由Y移到Z}
}void move(char u, int i, char v) {printf("move %d from %c to %c", i, u, v);
} 7.八皇后问题
#define N 8 //8*8的国际象棋棋盘
int X[N];
int B[2*N-1],C[2*N-1];
int A[N];
void mark(int i,int j,int flag) {//标志横线,左斜线,右斜线能否再次放置A[j]=B[i+j]=C[i-j+7]=flag;
}
bool AbleSet(int i,int j) {//判断这个横线,左斜线,右斜线能否放置return (A[i]==0&&B[i+j]==0&&C[i-j+7]==0);
}
void eightQueen(int k) {//从第0列开始尝试,一直到N-1for (int i = 0; i < N; i++) {if(AbleSet(k,i)) {X[k]=i;mark(k,i,1);if(k==N-1){for (k=0;k<N;k++)cout << X[k] << endl;}else eightQueen(k+1);//如果暂时合适,则进入下一列开始尝试mark(k,i,0);//没有合适情况,则回溯,取消这里的放置,重新尝试另一种}}//若运行到这里,则说明这一列已经放不了皇后了,前面的列有些问题,该工作栈弹出,回溯上一级。
} 8.写一个递归算法,对不带头结点的单链表进行逆序,要求输入参数是单链表的头指针,返回逆序之后的头指针。
Link_node inverse(Link_node ∗head){Link_node ∗new_head;if(head−>next == NULL) return head;//最简单情况,递归终止条件else{//将长度为n的链表拆分为1+(n-1)两部分,对后面部分进行逆序,再将这两部分交换位置即可new_head = inverse(head−>next);head−>next−>next = head;head−>next = NULL;return new_head;}
} 第四章:数组
1.快速转置稀疏矩阵,要求时间复杂度等于nu+tu(列+非零元个数)
ps:普通的行列转换要两个for,时间复杂度为nu*mu(行*列),远大于快速转置。
void FastTranspose(TSMatrix M, TSMatrix &T) {//M矩阵转置为Tint p, q, col;T.mu = M.nu; T.nu = M.mu; T.tu = M.tu;//mu、nu、tu代表矩阵行、列、非零元个数,构造T矩阵if (T.tu) {T.data = new Triple[T.tu]; rpos = new int[T.mu];int *num = new int[M.nu];for (col=0; col<M.nu; ++col) num[col] = 0;
//初始化num数组,num存储矩阵M的col列的非零元个数for (p=0; p<M.tu; ++p) ++num[M.data[p].j];
//num数组的下标表示M的第p个元素的列(j),制造num完成rpos[0] = 0; //rpos数组代表M中转置后元素应插入位置for (col=1; col<M.nu; ++col) rpos[col] = rpos[col-1] + num[col-1];
//制造rpos数组,非首项则按此规律计算在T中位置for (p=0; p<M.tu; ++p) {col = M.data[p].j; q=rpos[col];//找原M的列,和应该插入T中该列值的位置T.data[q].i = M.data[p].j; T.data[q].j = M.data[p].i;T.data[q].e = M.data[p].e; ++rpos[col];//转置操作,俩矩阵行(i)与列(j)互换,操作数不变,次序同时递加。}}else {//如果没有非零元T.data = NULL; rpos = NULL;}
}
理解示意图如下:

由【0 1 12】的“1”(列),找到rpos中的col=1,次序值为2,则插入到T中第二个位置(从上到下数第三个),转置后即【1 0 12】。
其他同理。
这一节就差不多,一篇文章无需很长,在这里留个空,下篇文章明天。
重头戏名单:树,图,查找表,排序
相关文章:
数据结构经典算法总复习(上卷)
第一章:数据结构导论 无重要考点,仅需了解时间复杂度。 第二章:线性表 1.获得线性表第i个元素 void GetElem_sq(SqList L, int i, ElemType &e) {if (i<1 || i>L.length) ErrorMsg("Invalid i value"); //注意错误监…...
JS获取URL中参数值的4种方法
方法1:现代浏览器都支持 URL 和 URLSearchParams 对象,可以很方便地从URL中提取参数 // 假设当前URL为 "https://example.com/?nameJohn&age30" const url new URL(window.location.href); // 或者你可以直接传入一个URL字符串 const …...
【面经】2024年软件测试面试题,精选100 道(附答案)
测试技术面试题 1、我现在有个程序,发现在 Windows 上运行得很慢,怎么判别是程序存在问题还是软硬件系统存在问题? 2、什么是兼容性测试?兼容性测试侧重哪些方面? 3、测试的策略有哪些? 4、正交表测试用…...
LabVIEW水泵性能测试系统
在现代工业应用中,水泵作为一种广泛使用的流体输送设备,其性能的可靠性对整个生产系统的稳定运行至关重要。通过LabVIEW软件配合专业硬件设备,设计了一套水泵性能测试系统,实现对各类水泵的综合性能测试与分析,提升水泵…...
React 第十九节 useLayoutEffect 用途使用技巧注意事项详解
1、概述 useLayoutEffect 是useEffect 的一个衍生版本,只是他们的执行时机不同 useLayoutEffect 用于在DOM更新执行完成之后,浏览器渲染绘制之前执行,这会阻塞浏览器的渲染; useEffect 的执行时机是在组件首次渲染和更新渲染之后…...
重温设计模式--2、设计模式七大原则
文章目录 1、开闭原则(Open - Closed Principle,OCP)定义:示例:好处: 2、里氏替换原则(Liskov Substitution Principle,LSP)定义:示例:好处&#…...
【NLP高频面题 - Transformer篇】Transformer的位置编码是如何计算的?
【NLP高频面题 - Transformer篇】Transformer的位置编码是如何计算的? 重要性:★★★ NLP Github 项目: NLP 项目实践:fasterai/nlp-project-practice 介绍:该仓库围绕着 NLP 任务模型的设计、训练、优化、部署和应用…...
基于SSM(Spring + Spring MVC + MyBatis)框架构建一个图书馆仓储管理系统
基于SSM(Spring Spring MVC MyBatis)框架构建一个图书馆仓储管理系统是一个涉及多个功能模块的项目,包括但不限于图书管理、读者管理、借阅管理、归还管理等。 1. 环境准备 确保你已经安装了以下工具和环境: Java Developmen…...
web的五个Observer API
IntersectionObserver: 一个元素从不可见到可见,从可见到不可见 ??IntersectionObserver是一种浏览器提供的 JavaScript API,用于监测元素与视窗的交叉状态。它可以告诉开发者一个元素是否进入或离开视窗,以及两者的交叉区域的…...
Java基础:抽象类与接口
1、抽象类和接口的定义: (1)抽象类主要用来抽取子类的通用特性,作为子类的模板,它不能被实例化,只能被用作为子类的超类。 (2)接口是抽象方法的集合,声明了一系列的方法…...
llama.cpp:PC端测试 MobileVLM -- 电脑端部署图生文大模型
llama.cpp:PC端测试 MobileVLM 1.环境需要2.构建项目3.PC测试 1.环境需要 以下是经实验验证可行的环境参考,也可尝试其他版本。 (1)PC:Ubuntu 22.04.4 (2)软件环境:如下表所示 工…...
Web前端基础知识(一)
前端是构建网页的一部分,负责用户在浏览器中看到和与之交互的内容。 网页是在浏览器中呈现内容的文档或页面。 通常,网页使用HTML、CSS、JavaScript(JS)组成。 HTML:定义了页面的结构和内容。包括文本、图像、链接等。 CSS:定义页面的样式…...
基于谱聚类的多模态多目标浣熊优化算法(MMOCOA-SC)求解ZDT1-ZDT4,ZDT6和工程应用--盘式制动器优化,MATLAB代码
一、MMOCOA-SC介绍 基于谱聚类的多模态多目标浣熊优化算法(Multimodal Multi-Objective Coati Optimization Algorithm Based on Spectral Clustering,MMOCOA-SC)是2024年提出的一种多模态多目标优化算法,该算法的核心在于使用谱…...
国标GB28181摄像机接入EasyGBS如何通过流媒体技术提升安防监控效率?
随着信息技术的飞速发展,视频监控技术已成为维护公共安全和提升管理效率的重要手段。国标GB28181作为安防行业的统一设备接入与流媒体传输标准,为视频监控系统的互联互通提供了坚实的基础。EasyGBS作为一款基于GB28181协议的视频云服务平台,通…...
[Unity] ShaderGraph动态修改Keyword Enum,实现不同效果一键切换
上次更新已然四个月前,零零散散的工作结束,终于有时间写点东西记录一下~ 实际使用中,经常会碰到同一个对象需要切换不同的材质,固然可以通过C#直接替换材质球。 或者在ShaderGraph中使用Comparison配合Branch实现切换ÿ…...
Unity开发哪里下载安卓Android-NDK-r21d,外加Android Studio打包实验
NDK下载方法(是r21d,不是r21e, 不是abc, 是d版本呢) google的东西,居然是完全开源的 真的不是很多公司能做到,和那种伪搜索引擎是不同的 到底什么时候google才会开始造车 不过风险很多,最好不要合资,风险更大 Andr…...
FFTW基本概念与安装使用
FFTW基本概念与安装使用 1 基本概念2 编译安装3 使用实例3.1 单线程3.2 多线程 本文主要介绍FFTW库的基本概念、编译安装和使用方法。 1 基本概念 FFTW (Fastest Fourier Transform in the West)是C语言的一个子程序库,用于计算一维或多维离散傅里叶变换(Discrete …...
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
Hiヽ(゜▽゜ )-欢迎来到蓝染Aizen的CSDN博客~ 🔥 博客主页: 【✨蓝染 の Blog😘】 💖感谢大家点赞👍 收藏⭐ 评论✍ 文章目录 行为型模式1、模板方法模式(1)概述(2&…...
教师如何打造专属私密成绩查询系统?
期末的校园,被一种特殊的氛围所笼罩。老师们如同辛勤的工匠,精心打磨着每一个教学环节。复习阶段,他们在知识的宝库中精挑细选,把一学期的重点内容一一梳理,为学生们打造出系统的复习框架。课堂上,他们激情…...
【1224】C选填(字符串\0占大小,类大小函数调用,const定义常量,逗号表达式取尾,abs返回值
1.设有数组定义: char array[]"China"; 则数组array所占的存储空间为__________ 6 注意要加上\0的位置 数组中考虑‘\0’,sizeof()判断大小也要考虑‘\0’ 2.初始化数组char[] strArray"kuai-shou",strArray的长度为(&am…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...
