自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(36)
  • 问答 (2)
  • 收藏
  • 关注

原创 蛮力法-分治法-处理最近对问题

两种方法对最近对问题的解释背景描述:  终于,隔了将近一周,开始更新第二篇算法博客。今天的问题是最近对问题。问题描述如下:对于二维坐标系中的若干个点,从中判断出相距最近的两个点,并输出最近的这个距离。  我之前也翻看了很多篇博客,大家都解释的很好,但是都只是输出了最近的距离,而我希望这个程序不仅能输出最近距离,同时还能锁定是哪两个点得到的这个最近距离。于是,经过反复试错后,终于得到满意的结果,马不停蹄过来更新博客了。蛮力法:  首先介绍蛮力法的思路。顾名思义,就是从第一个点开始,求它和第二个点之间

2022-03-24 20:32:13 3998 4

原创 DFS算法解决数独问题

DFS算法解决数独问题一,情景描述  一天晚自习,看到女朋友在旁边玩数独,便想着不如用个算法帮助她快速通关。毕竟,我想以后能成为一个AI算法工程师,所以现在不管是什么算法,多写点总归是有好处的。  对于这个程序的功能,我希望它能够从文件夹里读取棋盘,然后运行之后输出完整的棋盘。这样对于不同的棋盘,只要更改一下文件路径,就能输出结果。其实,我想着利用计算机视觉就可以直接输入图片,然后电脑自己处理自己输出。但是奈何大二的自己还对计算机视觉一无所知,就只能手动输入到文本文件中了。二,最初思路  最开始,

2022-03-20 21:09:52 1994

原创 连通网的最小生成树

什么是连通网的最小生成树在一个含有n个顶点的连通图中,一定可以选出n-1条边构成一个极小连通子图。这个子图包含有图中全部的n个顶点,但是只有足以构成一棵树的n-1条边,称这样的子图叫做极小连通子图,而构成的这棵树称为连通图的生成树。由于原来的图中每条边/弧上有对应的权值,所以生成的这棵树中权值和随着 n-1条边选取的不同而不同。权值和取得最小时得到的生成树就是最小生成树。有一个网得到其对应的最小生成树的算法有两种,克鲁斯卡尔(Kruskal)算法和普里姆(Prim)算法。克鲁斯卡尔(Kruskal)

2021-12-01 17:50:17 3313

原创 图的遍历(深度优先与广度优先)

图的定义和术语图是由顶点集合和弧的集合组成的。记作 G=(V,E).其中V(G)表示顶点集,E(G)表示弧集。顶点即为数据结构中的数据元素。<v,w>表示从 v 到 w 的一条弧,有方向的弧中,v 表示弧尾或者始点,w 表示弧头或者终点,此时的图称为有向图。(v,w)这样的无序对表示 v 和 w 之间的一条边。此时顶点之间不再强调方向性,称之为无向图。在实际应用中,图的弧或者边往往与具有一定意义的数相关,称这些数为权。带权的无向图和有向图分别称为无向网和有向网。图中的顶点数为 n .

2021-12-01 16:35:55 4232

原创 图的定义,术语,存储方式和建立

图的定义和术语图是由顶点集合和弧的集合组成的。记作 G=(V,E).其中V(G)表示顶点集,E(G)表示弧集。顶点即为数据结构中的数据元素。<v,w>表示从 v 到 w 的一条弧,有方向的弧中,v 表示弧尾或者始点,w 表示弧头或者终点,此时的图称为有向图。(v,w)这样的无序对表示 v 和 w 之间的一条边。此时顶点之间不再强调方向性,称之为无向图。在实际应用中,图的弧或者边往往与具有一定意义的数相关,称这些数为权。带权的无向图和有向图分别称为无向网和有向网。图中的顶点数为 n ,边或

2021-11-29 17:05:44 661

原创 树的应用(赫夫曼树及其应用)

相关定义赫夫曼树,又称最优树,是一类带权路径长度最短的树。以下仅限于讨论最优二叉树:路径指的是从一个结点到另一个结点之间的连线。路径长度指路径上线段(两个相连结点之间的连接线段)的个数。树的路径长度指的是从树根到树中其余每个结点的路径长度之和。结点的带权路径长度为从树根到该结点之间的路径长度与该结点上所带权值的乘积。树的带权路径长度定义为树中所有叶子结点的带权路径长度之和。假设有 n 个权值 {w1,w2,w3...wn},试构造一棵有n个叶子结点的二叉树,每个叶子结点的权值为 wi,显然构造出的二

2021-11-27 11:05:11 563

原创 树的应用 (堆排序,二叉排序树)

堆排序堆排序是对选择排序的一种改进方法,在此首先引进堆的概念。堆的定义是满足下列性质的数列:让这些数据排列成一棵完全二叉树,并且树中所有结点的值都要大于(或者小于)其左右孩子的值,此树的根结点就是堆顶,必定最大或者最小,对应的就是大顶堆和小顶堆。堆排序的算法思想是:将待排序数列整理成一个大顶堆,然后将堆顶数据与大顶堆的最后一个数据进行交换。接着再将除最后一个数据外的大数据调整为一个大顶堆,再将这个大顶堆的堆顶和最后一个数据进行交换。这样整个数列就从最右端开始逐渐向左有序化。该算法的核心包括两个.

2021-11-18 16:29:08 473

原创 树和森林的遍历 (树的建立和输出)

树和森林的遍历对于树的遍历从其结构出发有三种搜索路径:先根(次序)遍历树,先访问根结点,然后依次先根遍历根的各棵子树;后根(次序)遍历树,先依次后根遍历根的各棵子树,然后访问根结点;按层(次序)遍历树,从根结点起,依结点所在层次从小到大,每一层从左到右依次访问各个结点。森林的遍历也有两种方式:先序遍历森林,访问森林中第一棵树的根结点,先序遍历第一棵树中根结点的子树森林,最后先序遍历除去第一棵树之后剩余的树构成的森林;中序遍历森林,中序遍历森林中第一棵树的根结点的子树森林,然后访问第一棵树的根结.

2021-11-07 00:00:06 2636

原创 树和森林(定义,存储方法及向二叉树的相互转换)

树和森林的定义树和二叉树一样,也是一种多层次的数据结构,并且树中每个结点可以存在多个分支,因此它的应用领域更广。树是 n(n>=0) 个数据元素(结点)的有限集D,若D为空集则为空树,否则:(1), D中存在唯一的称为根的数据元素称为 root。(2), 当 n > 1时,其余结点可以分成 m 个互不相交的有限集,其中每个子集都符合树的定义,并成为 root 的子树。关于二叉树的各个术语都可以类似的对树进行定义。由于树中子树个数没有限定,所以树还有一个新的术语——“树的度”。定义为.

2021-11-06 14:45:46 2237

原创 线索二叉树(建立与输出)

线索二叉树的介绍遍历二叉树的过程就是沿着某一条搜索路径对二叉树中结点进行一次且仅一次的访问。而将访问的结点依次排列成一个线性序列之后,就可以通过这个线性序列对二叉树进行访问,此时就可以将二叉树视为线性结构进行访问(先序遍历,中序遍历等等得到的线性序列不同)。为此,可以在二叉链表的结点中再加上两个指针域,分别存放指向“前驱”和“后驱”的指针,这些指针称为线索,加上线索的二叉树称为线索二叉树。相应的存储结构称为线索链表。线索链表中的结点结构定义如下:typedef struct BiThrNode

2021-11-06 12:04:51 644

原创 二叉树遍历的应用(建立二叉树,求树深,复制二叉树)

建立二叉树的存储结构——二叉链表同一个二叉树可以用不同的顺序建立,不同的顺序对应不同的代码以及用户不同的输入。通过不同的顺序建立二叉树过程不同但是最终的结果相同,因此可以通过先序遍历建立二叉树,但是以中序遍历进行扫描遍历输出。为了避免二义性,用户时输入时必须将叶子结点的左右孩子指针用空格(或者其他字符)输入,表示该指针为NULL,用户输入时要严格按照建立的顺序进行输入。下面以先序遍历建立二叉树为例:(以先序遍历的路径建立二叉树,以中序遍历的路径读取并输出)#include<stdio.h&g

2021-11-06 01:16:54 724

原创 二叉树的遍历

问题的提出在二叉树的一些应用的,常常要求在树中查找具有某种特征的结点,或者对树中的所有结点进行逐一处理。这就提出了一个遍历二叉树的问题,就是如何按某条搜索路径访问树中的每个结点,使得每个结点都被访问到且仅被访问一次。对于二叉树的遍历,定义了三种不同的方法:先序遍历,中序遍历,后序遍历。别分表示:先访问根结点,再访问左结点,最后访问右结点。同理,中序即左根右,后序即为左右根。还有一种遍历路径层次遍历,顾名思义就是按照每一层的元素对二叉树进行遍历。如上图,先序遍历为ABCDEFGHK;中序遍历为

2021-11-05 21:50:58 144

原创 二叉树的定义 性质 及存储结构

二叉树的定义和基本术语二叉树是n个数据元素的有限集,它或为空集(n=0),或者含有唯一的称为根的元素,且其余元素分别分成两个互不相交的子集,每个子集自身也是一颗二叉树,分别称为根的左子树和右子树。集合为空的二叉树简称为空树,二叉树中的元素也成为结点。二叉树的左子树和右子树是两棵互不相交的二叉树,因此二叉树上除根之外的任何结点,不可能同时在两棵子树中出现。二叉树上每个结点至多只有两颗子树,并且有左右之分,其次序不能任意颠倒。下面接收一些名词,如上图,2是1的左孩子,3是1的右孩子;1是2和3的

2021-11-05 11:31:07 890

原创 矩阵的压缩存储(随机稀疏矩阵的建立和输出)

实际应用中会有很多利用高阶矩阵的问题,有的高阶矩阵已达到几十万阶,几千亿个元素。然而,多数的高阶矩阵中包含了大量的数值为零的元素,需要对这类矩阵进行压缩存储。因为合理的压缩存储不仅能有效地节省存储空间,而且可以避免进行大量的零值元素参加的运算。压缩存储即为多个相同的非零元素只分配一个存储空间,对零元素不分配空间。对于矩阵分为两类,假若值相同的元素或者零元素在矩阵中的分布有一定的规律,则称它为特殊形状矩阵;否则称为随机稀疏矩阵。未必所有的矩阵都可以压缩,要看其是否具备以上压缩条件特殊形状矩阵的存储

2021-11-04 21:25:20 1916 2

原创 数据结构之数组

数组的定义和操作数组的本质是线性表。一维数组即线性表;二维数组定义为其数据元素为一维数组的线性表;三维数组定义为其数据元素为二维数组的线性表。N维数组是N-1维数组的线性表。基于C语言的特点,数组的每一维的下界都约定为0。一般情况下,数组的每一维的上下界都可以任意设定。但是数组一旦被定义,其维数(N)和每一维的上下界均不能再变,数组中元素之间的关系也不再改变。因此,数组的基本操作除初始化和结构销毁之外,只有通过给定的下标取出或修改相应的元素值。数组的顺序表示和实现由于对数组的操作没有插入和删

2021-11-03 16:56:33 1217

原创 正文编辑———串操作应用举例

正文编辑含义:正文编辑程序是一个面向用户的系统服务程序。其实质是修改字符数据的形式或格式。各种办公软件(如 WPS,Microsoft Word)工作的基本原理都是正文编辑。基本功能一般包括串的查找,插入,删除和修改等基本操作。在编辑程序中,则可以将整个正文看成是一个“正文串”,页是正文串的子串,而行则是页的子串。进入正文编辑时,程序为整个正文串建立相应的页表和行表。页表的每一项列出页号和该页的起始行号,行表的每一项指示每一行的行号,起始地址,和该行子串的长度。正文编辑程序中设有页指针,行指

2021-11-01 21:09:14 337

原创 正文模式匹配

正文模式匹配在计算机处理的各类数据中有很大一类属于正文数据,也常称为文本型数据。这些数据由字符组成行,再由行组成正文。几乎所有对正文继续编辑的软件都提供“查找”的功能。即在正文中查询有没有和给定子串相同的子串。若存在,则将屏幕上的光标移动到这个子串的起始位置。这个操作即为串的定位操作,通常称为正文模式匹配。代码展示如下#include<stdio.h>int Index_BF(char S[], char T[], int pos){ //若串S中,从第pos个字符起存在和

2021-11-01 19:58:05 170

原创 派生类组合类 计算圆锥体体积

问题描述定义一个point类,用来记录点的坐标。由point类派生出cricle类,继承圆心坐标,同时增加新的数据成员,半径r。最后定义组合类cone,其中有两个成员对象,一个是顶点point,一个是底面圆corcle,同时增加新的数据成员,体积V。输出圆锥体积V。代码展示#include<iostream>#include<iomanip>#define PAI 3.14using namespace std;class point //定义类

2021-10-27 11:45:18 667

原创 类族对象统计

问题描述:类person派生出类student和类teacher,其中student类派生出类graduate类和undergraduate类。用各种方法建立类对象,并统计各类对象的个数。代码如下:#include<iostream>using namespace std;class person{ //定义person类 其中私有成员数据idprivate: int id; //人物编号 static int numberp;

2021-10-25 00:43:35 493

原创 组合类闹钟

问题描述:利用组合类,写出闹钟程序。一个类定义为clock,用爱

2021-10-19 21:50:33 246

原创 重载函数 传值与传引用

问题描述:设计一个类Computer,类中包含多个重载函数add,进行两个int,float,double数相加,char与int相加,两个字符串相连,返回相应的数。参数传递用传值与传引用方式。代码如下:#include<iostream>#include<string>using namespace std;class Computer {public: int add(int a, int b) { return (a + b); } fl..

2021-10-19 20:46:52 416

原创 纯C语言 链表存储 商场库存管理系统(含文件输入输出)

问题描述:利用链表存储数据,保存商场的商品信息与数据结点中。然后面向三种身份建立三种不同的操作界面。对应于经理,售货员,补货员。其中经理可以进行1-修改商品价格 2-增加商品库存 3-增加新商品种类 4-显示所有商品信息 5-新建文本文件保存今日库存等操作;售货员可以进行1-卖商品 2-查询某种商品信息 3-显示所有商品信息等操作;补货员可以进行1-采购商品 2-查询某种商品信息 3-显示所有商品信息等操作。其中对于经理的操作5,可以建立一个新的文本文件,并将当日的商品信息输入到文本文件中并保存,然后显

2021-10-19 17:49:03 1689 3

原创 数据结构 串的定义,操作,表示和实现

串的相关定义与概念串也叫字符串,是由零个或多个字符组成的有限序列,形如 s = "a0a1​...an-1 ";其中 s 是串的名,双引号括起来的字符序列是串的值。字符可以是字母,数字,或其他字符。串中字符的数目 n 称为串的长度,零个字符的串为空串,它的长度为零。串中任意连续的字符称为串的子串,包含子串的称为对应的主串。子串在主串中的位置数值就等于子串中第一个字符在主串中前面的字符数量。两个串之间的比较,长度相等并且对应位置的数据元素也相同则两个字符串相等。若是不相等,则从第一个字符开始比较,谁大则.

2021-10-12 21:57:26 858

原创 数据结构 队列的应用之输出杨辉三角

队列的应用队列的应用主要体现在四个方面,1解决计算机主机与外设不匹配的问题,2解决由多用户引起的资源竞争问题,3离散事件的模拟,模拟实际应用中各种排队问题,4用于处理具有先进先出的过程问题。杨辉三角利用队列同时引入行界值0放在两行数据之间。最开始输出杨辉三角的最顶端 1 ,然后建立队列并将数据 0 1 1 一次插入到队列之中。其中 1 1是第一行的元素(三角的最顶端1不算行数),0就是行界值。行数k=1表示即将输出第一行(即 1 1)。进入while循环,while循环的目的是输出前n-1行的数

2021-10-11 20:51:11 2453

原创 数据结构 队列的结构特点及基本操作

队列的结构特点及操作队列是限定只能在表的一端进行插入,在表的另一端进行删除的线性表。表中允许插入的一端称为队尾,允许删除的一端称为队头。总结下来就是只能在队尾插入,在队头删除。也就是在队尾进去之后从队头出去。在队尾进行插入的操作称之为入队列,在队头进行删除的操作叫做出队列。队列也有两种存储方式,分别为链队列和循环队列。链队列用链表表示的队列简称为链队列。一个链队列需要两个分别指向队头和队尾的指针(分别叫头指针和尾指针)。为了操作方便,为链队列添加一个头结点,并约定头指针始终指向这个头结点,尾指针

2021-10-06 21:09:05 3976

原创 数据结构 栈的应用举例

数制转换问题问题描述:输入一个非负的十进制整数,然后输出与其等值的八进制数。该问题用栈这一数据结构来解充分说明了栈的先进先出后进后出的特性。本质就是对十进制数进行除以八取余数,最后逆序输出余数。可以将最初得到的那个余数存在栈里,然后最终输出时就可以最后输出这个余数。将八改成二或者其它的数可以求得其它进制的数。#include<stdio.h>#define TRUE 1#define FALSE 0/*************************************

2021-10-05 12:47:41 292

原创 数据结构 栈的结构特点及基本操作

栈的结构特点和操作栈是限定只能在表的一端进行插入和删除的线性表,在表中,允许插入和删除的一端称为“栈顶”,不允许插入和删除的一端称为“栈底”。栈的元素进出是按照“先进后出,后进先出”的顺序进行。和线性表类似,栈也有两种存储方法顺序栈和链栈。顺序栈顺序栈是指利用顺序存储分配实现的栈。同时附设top指针指示栈顶元素在顺序栈中的位置。用一维数组来描述顺序栈中数据元素的存储区域,并预设一个最大的存储空间。对于top指针,由于数组的第一个元素的下标为0,所以初始化top=-1;表示是个空栈。输出栈内数据元

2021-10-04 17:38:26 2349

原创 数据结构 基数排序

对于一个关键字,将其看成由d个小关键字组成,然后每个关键字的范围中都有r个取值可能,称之为基数。例如,关键字是0~999的一个数字,则它有三个小关键字,每个关键字的范围是0~9,则按照最低位开始,将所有关键字分配到0~9这r个队列,然后收集在一起,进行三次就可以排好序。关键字是由5个字母组成的单词,则它有5个小关键字,每个关键字的范围是a~z,则从最低位开始将其分配到a~z这26个队列,然后收集在一起,进行5次就可以排好序。每次对于小关键字的收集,只用收集不用排序。...

2021-10-03 13:48:30 411

原创 数据结构 先进排序

快速排序快速排序的基本思想就是通过一趟操作将一个无序的序列分割成相邻的两个区域,其中一个区域中数据的关键字都比另一个区域中的小,(即找到一个枢轴,以其为居中标杆,右边的都比它小,左边的都比它大)。然后对两个区域分别进行这样的操作,直到整个序列呈现有序状态。对与本算法而言,要调用三个函数。第一个函数,int Partition(RcdType R[], int low, int high), 作用是将low...high序列进行一次划分并返回枢轴的位置。具体操作为定义pivotkey,将序列最左边数据

2021-10-01 22:36:20 298

原创 数据结构 基本排序(选择 插入 冒泡)

在很多情况下,有序表比无序表的效率要高得多。对于排序,不仅是对于普通的数字编号进行排序,对于抽象的文章,图片,视频等等信息都可进行排序。(这里的排序不是说给它们编号在对编号排序,而是真正对其所包含的关键字排序,这种规律是可以联系到其本身的含义的!)由于编者水平有限,以下介绍的均为对数据的排序。对于一个表想让其转化成有序表,则需要表中每个数据项都有可以相互比较的元素。为此引入关键字,通过关键字的比较排列,使整个表呈非递增和非递减的规律;这种加了关键字的数据元素被定义为“记录”。typedef int

2021-09-26 21:38:43 191

原创 数据结构 有序表

有序表就是表中的数据元素按照非递减或者非递增的规律进行排列。有序表的基本操作和线性表大致相同,并且有序表也可以有顺序表和链表两种存储表示方法。在顺序有序表中进行插入操作...

2021-09-22 20:26:06 2833

原创 数据结构 链表之循环链表与双向链表

循环链表循环链表的特点是表中最后一个节点的指针域指向第一个结点,整个链表成为一个由链指针相链接的环。通常在表中第一个结点之前加上一个头结点,并令头指针指向最后一个结点。一般情况下头结点的数据域不存储任何信息。空表的循环链表由只含一个自成循环的头结点表示。循环链表的操作与单链表基本一致,差别仅在于算法中判别表尾的循环条件不是(顺链扫描的)指针p是否为NULL,而是它是否等于头指针。 非空的循环链表 头指针a指向最后一个结点空的循环链表循环链表两表的合并对于单链表的...

2021-09-21 12:13:30 368

原创 数据结构 单链表的其他操作

例题一:逆置单链表void InvertLinkedList(LinkList &L)本题的思路是创建链表之后,定义两个指针s,pp指针指向L,代替L的头指针功能,s指向每一个需要移动的结点。移动的顺序就是先让原来的头指针L=NULL, 然后将原链表的第一个结点删除,转接到新链表的L后面。往后原链表的每一个“头结点”都删除转接到L后面,形成逆置。#include<stdio.h>typedef struct LNode{ int data; struct LNo.

2021-09-21 00:38:37 211

原创 数据结构 线性表之单链表

链表中通常都是包含两部分,一个数据域,一个指针域。前者用于存储所需要的各种数据,后者用于存储后继结点的地址。通常有一个头指针指向链表的头结点,然后头结点的指针域指向第一个结点,最后一个结点的指针域为NULL,表示后面没有了。相比于顺序表,链表的每个结点数据所占的内存可以分布在计算机内存的各个角落,需要时动态分配。逆序创建单链表void CreateList_L(LinkList &L, int a[], int n)创建单链表时,首先定义链表这一数据结构,然后再定义单链表变量。其实再定

2021-09-20 18:21:56 280

原创 数据结构 顺序表的相关算法操作

例题一:比较两个顺序表的大小比较是通过由两个表的首数据一次向后遍历,逐个比较。如遇到A.elem[i] > B.elem[i],则A>B.如遇到A.elem[i] <B.elem[i]则B<A,若A.elem[i] =B.elem[i]则下一个数据继续比较。#include<stdio.h>#include<string.h>const int LIST_INIT_SIZE = 100;const int LISTINCREMENT = 1..

2021-09-20 14:04:26 306

原创 数据结构 线性表之顺序表

顺序表中的数据是以数组的形式进行存储的。想创建一个顺序表,首先要定义顺序表这个数据结构,然后再定义顺序表变量。顺序表中包含存放数据的数组,实时的表长,当前分配的数组容量,一次扩容时的增补空间量这四种要素。当然,还可以对顺序表进行各种操作。顺序表的建立void InitList_Sq(SqList &L,int maxsize=LIST_INIT_SIZE,int incresize=LISTINCREMENT)建立的前提是先定义这个数据结构,然后再定义这种数据类型变量。在函数中先给数.

2021-09-19 23:35:15 714

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除