数据结构与算法
文章平均质量分 92
偷影子的人儿
这个作者很懒,什么都没留下…
展开
-
字符串的模式匹配算法
模式匹配算法前言对于数据结构中串的章节,最为重要的莫过于串的模式匹配算法:即为求给定子串在主串中的出现的位置。从最开始的朴素模式匹配到后来的KMP算法,再到改良的KMP算法,算法逐渐改良,理解难度也逐渐加大。本人曾经多次阅读相关内容,怪于自身理解能力有限仅一知半解,但心中甚为挂念。今再次读之理解更深入之,遂记之以铭后效。注解:本文字符串结构皆为顺序存储结构,且使用下标为0的数组分量表示字符串的长度主串标记为字符数组S,子串或者模式注为字符数组T朴素模式匹配算法//返回子串T在主串S中第pos原创 2021-05-15 11:34:01 · 566 阅读 · 2 评论 -
辗转相除法
求两个数的最小公约数经常使用辗转相除法。代码很简单,如下所示:#include<stdio.h>int main(){ int M,N; scanf("%d %d",&M,&N); int a=M,b=N; if(M<N)//先调整大小,使M为两数中较大者,N为较小者 { int t=M; M=N; N=t; } int r=M%N;//求得余数 w原创 2020-12-22 17:36:37 · 5432 阅读 · 1 评论 -
拓扑排序以及求解关键路径
拓扑排序以及求解关键路径都是属于有向无环网的应用拓扑排序:解决工程能否顺序进行的问题介绍2个概念AOV网:在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,我们称之为AOV网。弧表示活动之间的某种制约关系:比如演职人员确定了,场地联系好了,才可以开始进场拍摄。 AOV网中不能存在回路,即不能存在环,否则某个活动的开始要以自己完成...原创 2019-10-29 23:57:44 · 3664 阅读 · 0 评论 -
最短路径算法(迪杰斯特拉算法,弗洛伊德算法)
最短路径:非网图:指两个顶点之间经过的边的数量最少的路径网图:指两个顶点之间经过的边上权值之和最少的路径两种算法:迪杰斯特拉算法:求某个源点到其余各顶点的最短路径问题 弗洛伊德算法:求图中每一对顶点之间的最短路径1.迪杰斯特拉算法(Dijkstra)迪杰斯特拉是一个按路径长度递增的次序产生最短路径的算法大致道理:引进辅助分量D,每个分量D[i]表示从初始点到终点的最...原创 2019-10-29 13:20:36 · 1734 阅读 · 0 评论 -
最小生成树算法(普里姆算法和克鲁斯卡尔算法)
什么是生成树?一个连通图的生成树是一个极小的连通子图,它含有图中全部的n个顶点,但是只有足以构成一棵树的n-1条边。理解:连通图是属于无向图的范畴,有向图的连通子图叫强连通图 它含有n个全部顶点,只有n-1条,将n个顶点连起来至少要n-1条边 少于n-1条边连不起来,那么则无法连通。比如10个点直线连起来至少中间要有9条边 多于n-1条边会形成环,是连通图,但是不是极小的连通子图...原创 2019-10-25 12:59:34 · 3384 阅读 · 0 评论 -
插入排序(直接插入排序,折半查找插入排序,2-路插入排序,表插入排序,希尔排序)
直接插入排序(n个元素非递减排序)原理:将一个记录插入到已经排好序的有序表中(将序列第一个记录看做只有一个记录的有序序列),得到新的记录数+1的有序表//顺序表结构#define MAXSIZE 20typedef struct{ int r[MAXSIZE];//默认是短整形 int length;//表长}SqList;步骤:将第i个记录插入前面含有第...原创 2019-10-07 13:48:17 · 860 阅读 · 0 评论 -
排序算法学习之交换排序(冒泡排序,快速排序)
冒泡排序名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。步骤:进行第i趟排序:比较第1个记录和第2个记录关键字,逆序则交换两个记录 往后比较第2个记录和第3个记录,逆序则交换两个记录 依次往后比较,直到比较完第n-i个记录和第n-i+1个记录,逆序则交换两个记录 关键字最大的记录...原创 2019-10-08 17:51:06 · 148 阅读 · 0 评论 -
选择排序(简单选择排序,树形选择排序,堆排序)
简单选择排序基本思想:第i趟排序经过n-i次关键字的比较在n-i+1(i=1,2,3,......n-1)个记录中选取关键字最小的记录作为序列的第i个记录直接看代码!没啥好说的这个!void SelectSort(SqList *L){ for(int i=0;i<L->length-1;i++){//总共进行n-1趟排序,便可使整个序列有序 { ...原创 2019-10-09 19:43:38 · 592 阅读 · 0 评论 -
排序算法学习之归并排序(2-路归并排序)
归并排序基本思路:假设初始序列有n个记录,则可看成是n个有序的子序列,每个序列长度为1,然后两两归并,得到个长度为2或者是1的有序子序列;再两两归并,,,,如此重复,直到得到一个长度为n的有序序列为止,这种排序方法称为2-路归并排序。详细动态图解(详细图解)-------号外:归并排序发明者竟然是约翰-冯诺伊曼归并操作的工作原理如下:第一步:申请空间,使其大小为两个已经排序序列...原创 2019-10-10 20:43:02 · 1085 阅读 · 0 评论 -
程序设计实践之车辆信息管理系统
为杭州市车辆管理所建立车辆信息录入系统。编写具有下列功能的菜单驱动的程序。添加车辆信息显示所有车辆信息删除车辆信息 让操作者输入要删除车辆的车牌,将其删除查询车辆信息 让操作者输入要查询车辆的车牌,显示其信息或提示无清空车辆信息更新车辆信息退出系统啥也不敢说,啥也不敢问,直接看代码#include <stdio.h>#include <stdlib...原创 2019-07-09 00:46:49 · 1733 阅读 · 3 评论 -
数据结构习题集之银行业务模拟(双队列事件驱动)
个人感受和想法:写这个课程设计很煎熬,时间话的太久,我就是一个容易死磕的笨蛋,一直不太理解离散事件驱动,在网上看了很多博客,感觉乱糟糟看不下去,有些对离散事件驱动感觉写的体现不明显,我就比较偏执所以主线是根据事件驱动函数执行的,其实这个里面涉及到一些解锁开锁的问题,操作系统里面的知识我忘记了许多,并且这个程序是模拟,初始条件随机,对于出现结果难于预期,于是感觉还是比较绕吧,但还是被我怼出来了!...原创 2019-07-21 21:59:47 · 1020 阅读 · 0 评论 -
快速排序精讲
快速排序是对于冒泡排序的改进那么它是如何改进的呢??假设有n个记录值,冒泡排序的排序过程的最差情况经历n-1趟排序,每一趟排序中前后相邻的值进行交换,每个值逐步地移动到它应该有的位置,序列从无序状态到渐进到有序状态(每次交换都是相邻交换),经过n-1趟交换效果的累积,终于达到整体有序相比之下快速排序呢是粗精度到高精度的冒泡排序,首先选取一个PivoKey,用以将序列分成相邻的2段,左边为小...原创 2019-03-14 22:08:54 · 245 阅读 · 0 评论 -
2路插入排序
2路插入排序2路插入是在折半插入的基础上进行改进。折半插入在原先直接插入的基础上改进,通过折半查找,以较少的比较次数就找到了要插入的位置,但是在插入的过程中仍然没有减少移动次数,所以2路插入在此基础上改进,减少了移动次数,但是仍然并没有避免移动记录(如果要避免的话还是得改变存储结构)那么如何减少的移动次数???常规的一个数组{2, 7, 8,10,15 ,29,30, 40,50,66,7...原创 2019-03-13 14:33:15 · 4882 阅读 · 2 评论 -
数据结构习题集之运动会分数统计
运动会分数统计#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct Score{ char AthleteName [20]; char SchoolName [20]; int SchoolCode; int Rank; ch...原创 2019-04-10 18:49:05 · 7845 阅读 · 1 评论 -
数据结构习题集之停车场管理
停车场管理【问题描述】设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等待,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其...原创 2019-04-25 23:11:49 · 2175 阅读 · 0 评论 -
数据结构习题集之魔王语言解释
魔王语言解释问题描述有一个魔王总是使用自已的一种非常精练而抽象的语言讲话,没有人能听得懂。但他的语言是可以逐步解释成人能懂的语言的,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:(1) α→β1β2…βm(2) (θβ1β2…βm)→(θβm…β2θβ1θ)在这两种形式中,从左到右均表示解释; 从右到左均表示抽象。写一个魔王解释程序,将魔王的话解释成人能听懂的话。基...原创 2019-04-27 01:08:42 · 2613 阅读 · 0 评论 -
摩尔投票算法
摩尔投票算法顾名思义是一种类似投票过程的算法其由1981年出版的Robert S. Boyer和J Strother Moore的名字命名,并且是流式算法的典型例子。LeedCode原题:给定一个大小为n的数组,找到其中的众数。众数是指在数组中出现次数大于⌊ n/2 ⌋的元素。你可以假设数组是非空的,并且给定的数组总是存在众数。易知事实:由于假定总是存在众...原创 2019-05-07 17:13:15 · 141 阅读 · 0 评论 -
数据结构习题集之算数表达式求值演示
数据结构习题集实习之算数表达式求值演示问题描述:设计一个程序,演示用算符优先法对算数表达式求值的过程基本要求:以字符形式从终端输入语法正确的,不含变量的整数表达式。利用教科书表3.1给出的算符优先关系,实现对算数四则混合运算表达式的求值,并仿照教科书的例子3-1演示在求值中运算符栈、运算数栈、输入字符和主要操作的变化过程。#include <stdio.h>#inclu...原创 2019-07-09 12:57:35 · 1531 阅读 · 1 评论 -
数据结构习题集实习之航空客运订票系统(示意系统,全部数据放在内存)
航空客运订票系统1、系统名称:航空客运订票系统航空客运订票的业务活动包括:查询航线、客票预定和办理退票等。要求在TC或VC环境下设计一个航空客运订票系统,以使上述业务可以借助计算机来完成。2、要求:(1)每条航线所涉及的信息有:终点站名、航班号、飞机号、飞行日期(星期几)、乘员定额、余票量、已经订票的客户名单(包括姓名、订票量)以及等候替补的客户名单(包括姓名、所需票量)。(2...原创 2019-08-03 00:43:56 · 4422 阅读 · 8 评论 -
希尔排序
希尔(Shell)排序又称为缩小增量排序,它是一种插入排序。它是直接插入排序算法的一种威力加强版。希尔排序是非稳定排序算法直接插入排序:对于数据量较小,数据序列基本有序的情况下算法复杂度较低希尔排序基本思想:通过将序列划分若干组小数据量的序列(设置增量序列),别且对各组序列分别进行直接插入排序。因此:希尔排序等价于将原有数据量大的直接插入拆分成数次小的直接插入,形成基本有序的序列,通过最后增...原创 2019-03-14 15:12:22 · 110 阅读 · 0 评论