算法与数据结构
文章平均质量分 77
github.com/4gnosed
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
快排思想找1亿个数的前100个最大值
从一亿个随机数里寻找前100个最大的数,如果根据常规的快速排序排完一亿个数,再取前100个数,那么耗时11~12s(VM内存设置 :-Xms256m -Xmx1024m),因为只需要取前100个最大值,所以不必全都排序,只需根据快速排序的思想,判断pivot的当前位置 i 与99(第100个数组下标)的关系: quickSortTop(int[] arr, int start,...原创 2019-10-14 17:55:03 · 954 阅读 · 1 评论 -
图_dijkstra算法【数据结构实践报告】
数据结构实验报告实验名称: 实验七 图 dijkstra算法学号:***姓名:gnosed实验日期:2017.12.23 一、实验目的掌握求最短路径的Dijkstra算法 二、实验具体内容1、实验题目1:(1)题目编写程序,用Dijkstra算法求图的最短路径(2)分析存储结构:图以邻接矩阵表示,关系矩阵对角线初值取为0。 数组dist[]:dist[i]最终储存Vo到Vi的最短路径及最短路径上V...原创 2017-12-23 02:40:11 · 3700 阅读 · 0 评论 -
最小生成树的构造
prim算法(破圈法)kruskal算法(避圈法)基本思想:设G=(V,E)是网络,最小生成树的初始状态为只有VN个顶点而无边的非联通图T,T中每个顶点自成一个连通图。将集合E中的边按权递增顺序排列,选择 两个顶点分别在不通风的连通图且权最小的 边加入图T,则原来的两个连通图成为一个连通图。以此类推,知道T中所有的顶点都在同一个连通图中为止,该连通图就是所求的最小生成树。处理过程中加入原创 2018-01-09 12:06:23 · 1533 阅读 · 0 评论 -
哈夫曼树(最优二叉树)的构造【二叉树的应用】
对于给定一个长度为m序列,构造一颗以序列值为权的m个外部结点的扩充二叉树,使得带权的外部路径长度WPL最小,就称这颗扩充二叉树为 哈夫曼(Huffman)树(最优二叉树)。构造Huffman Tree 的算法也就是哈夫曼算法。算法基本思想:1)给定m个权值,首先构造m课扩充二叉树,每颗只有一个外部结点(根结点)。2)在已经构造的所有扩充二叉树中,选择根结点权值最小的和次小的两颗,将...原创 2018-01-09 14:32:52 · 3960 阅读 · 0 评论 -
队列满、队列空的判断
对于队列来说,根据队列先进先出的特点,在使用顺序存储结构时,可能会出现假溢出现象:队列每运行一次插入,sq->r(指队列尾元素的下一个元素)就增加1;每运行一次删除,sq->f(指队列头的元素)也增加1,这使得被删除的空间永远也用不到。为了解决假溢出的问题,要使用环形队列,即把数组sq->q[MAXNUM]从逻辑上看成一个环,即规定sq->q[0]是sq->...原创 2018-03-09 11:00:29 · 16856 阅读 · 0 评论 -
如何在 对称序线索二叉树 中找某结点 在先根序列中的 后继结点?
我们知道,对称线索二叉树的意义在于,中序遍历这种二叉树时不需要栈结构,也不需要递归实现,而且可以确定某结点在中序序列中的前驱和后继结点。那么现在,如在利用对称序线索二叉树,找到某结点在先根序列中的后继结点呢? 要找到先根序列中的后继结点,可以先直接先根周游已经构造好的对称序二叉树,得到这颗二叉树的先根序列,再搜索后继结点即可。那么,如何先根周游对称序二叉树? ...原创 2018-03-19 11:43:03 · 4320 阅读 · 0 评论 -
线索二叉树
二叉树的链式存储如下图, 不难发现,图中所示的左—右指针表示中,有一半以上的指针是空的。事实上,所有包括n个结点的二叉树的这种表示中,每个结点有两个指针,一共有2n个指针,其中除根结点外,每个结点都被一个指针所指,所以只有n-1个指针不为空,而另外的n+1和指针为空。 另外,遍历是二叉树许多操作的基础,经常使用,但是一般的遍历算法需要大约O(n)的时间代价,如此多次反复...原创 2018-03-13 19:21:59 · 1846 阅读 · 1 评论 -
优先队列【堆实现、二叉树的应用】
优先队列(PriorityQueue)与普通的队列(Queue)不同,不遵循“先进先出”的原则,而是遵循“最小元素先出”的原则。由于历史原因,人们已习惯于用“队列”为后缀称呼这种结构,因此就沿用了优先队列这个名字。优先队列有三个基本操作:插入一个元素,找出最小的元素,删除最小的元素。 优先队列如何实现? 可以用单链表实现,这样插入一个元素的时间代价为常数...原创 2018-03-14 14:10:57 · 921 阅读 · 0 评论 -
二叉排序树的实现
二叉排序(搜索)树是以关键码为结点的二叉树,其性质:如果任一结点的左子树非空,则左子树的所有结点的关键码都小于根结点的关键码;如果任一结点的右子树非空,则右子树的所有结点的关键码都大于根结点的关键码。二叉排序树的存储结构如下,typedef struct BinSortNode* PBinSortNode;typedef struct BinSortNode* BinSortTre...原创 2018-03-25 12:51:04 · 2480 阅读 · 0 评论 -
贪心算法解决0-1背包问题
背包问题描述如下: 已知 背包容量M=120 物品种类数n=10 各种物品的总效益pi(i=1,2,………10) : 50,60,70,80,90,80,70,60,50,40 各种物品的总重量wi(i=1,2………10) : 17,30,25,41,80,70,64,56,47,38求: 各种物品所取重量占其总重量的比例xi(i=1,2,…..10),满足0<=xi<...原创 2018-06-23 22:48:28 · 27616 阅读 · 5 评论 -
用Floyd算法解决最短路径问题(动态规划)
求图的任两结点间的最短距离,采用动态规划原理的Floyd算法,算法具体解释见另一篇原创 https://blog.youkuaiyun.com/gnosed/article/details/78956449 ,还提到求一个顶点到其他顶点的Dijkstra算法。下面是一个例子,只输出了最短路径的值。#include <stdio.h>#define Adjtype int#define VN 1...原创 2018-06-24 17:03:49 · 4311 阅读 · 0 评论 -
二叉树的构造、非递归遍历、查找叶子节点【Java实现】
二叉树的构造方法不一,这里根据存储结点次序的数字关系来构造父节点和孩子结点的关系(parentIndex*2+1==leftChildIndex,parentIndex*2+2==leftRightIndex),关于二叉树非递归遍历的详细介绍请看 二叉树的建立与遍历,下面程序还实现了查找叶子节点、查找某一元素是否存在的功能。import java.util.LinkedList;impor...原创 2018-10-25 21:15:41 · 3448 阅读 · 0 评论 -
最短路径(图)
Dijkstra算法Dijkstra算法为求带权图中从一个顶点(此处假设为Vo)到其它各顶点的最短路径,按路径长度递增的次序产生最短路径,假设所有权值非负。储存结构:1.图采用邻接矩阵表示法,对角线元素初值均取0。2.数组dist[]:dist[i]最终储存Vo到Vi的最短路径及最短路径上Vi的前驱顶点(计算过程为距离值,可能会被调整)。说明:1.dist[ ]可分为集合U和V两部分,U指从Vo到...原创 2018-01-02 22:17:17 · 681 阅读 · 0 评论 -
拓扑排序
定义: 拓扑排序是上AOV网上的应用,AOV网即是顶点活动网(active on vertex network),顶点表示活动,边表示活动间的某种约束关系。如果图中所有顶点可以排成一个线性序列,且如果从顶点Vi到Vj存在一条路径,则在序列中顶点Vi一定排在Vj之前,就把这种序列称为拓扑序列,构造拓扑序列的操作叫作拓扑排序。如下图中,用顶点表示课程,有向边表示课程之间的优先关系, ...原创 2018-01-02 22:14:04 · 328 阅读 · 0 评论 -
八皇后问题(回溯法)
问题描述在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上(与水平行轴成45°或135°),问有多少种摆放方案?思路从第一行第一列开始,1)考虑当前第row行第col列这个位置,要判断当前位置是否可存放2)若不可存放则考虑这一行的下一列,返回1)3)若可存放,则记录。然后判断当前是否为最后一行,是则说明找到一种方案并输出3)若不是最后一行,则考...原创 2018-03-13 15:13:01 · 439 阅读 · 0 评论 -
KMP匹配算法源码
模式匹配问题,即字符串的匹配,int index(String t,String p),求p在t中第一次出现的位置。如何高效地匹配?先来讨论朴素的回溯的模式匹配。例如,设t=“abbaba”,p=“aba”,p的长度为6(plen=6),t的长度为3(tlen=3)。匹配过程如下:算法如下:int index(string p, string t){...原创 2017-10-04 11:57:49 · 409 阅读 · 0 评论 -
多项式相加减【数据结构实验报告】
注意:Code://head file: "Poly.h"#ifndef POLY_H_INCLUDED#define POLY_H_INCLUDEDstruct Polynode{ double cof; int exp; struct Polynode* next;};typedef struct Polynode* plist;原创 2017-10-20 02:01:11 · 6142 阅读 · 0 评论 -
迷宫问题【数据结构实验报告】
数据结构实验报告实验名称:实验二 迷宫问题学号:***姓名:gnosed实验日期:2017.10.23 一、实验目的1、了解回溯法在求解迷宫问题中的应用2、进一步掌握栈的使用 二、实验具体内容1、实验题目1:(1)题目用回溯法求解迷宫问题,可以用一个栈保存探索的序列。并且在该迷宫的行走中,站在一点可以有八个方向选择。比如如下的迷宫Ente...原创 2017-10-27 12:31:01 · 32093 阅读 · 3 评论 -
二叉树非递归深度优先DFS算法
二叉树可以递归遍历,实现简洁,易于理解。这里介绍二叉树的非递归的三种遍历,以下图二叉树为例讲解。先前声明#define ELEMENTTYPE chartypedef struct node* pnode;typedef struct node* PBintree;struct node{ ELEMENTTYPE n; pnode lchild; pn...原创 2017-10-06 10:58:14 · 2441 阅读 · 0 评论 -
算术中缀表达式求值(栈实现)
问题描述:输入由整型分量和操作符组成的中缀表达式,输出其后缀表达式和运算的结果。整型分量:十进制数。操作符:( , ) , + , - , * , / 。如输入3*(5-8/2)+7,输出 3 5 8 2 / - * 7 +,结果是10;输入3-(1/4+7)*3 ,输出 3 1 4 / 7 + 3 * -,结果是 -18.75;输入3*4/5*(5-7)+4,输出 3 4 * 5 / 5 7 -...原创 2017-10-29 10:29:00 · 21099 阅读 · 3 评论 -
农夫过河【数据结构实验报告】
数据结构实验报告实验名称:实验三 农夫过河学号:***姓名:gnosed实验日期:2017.10.30 一、实验目的1、进一步掌握队列的使用2、会使用队列进行农夫过河解的搜索 二、实验具体内容1、实验题目1:(1)题目经典的农夫过河问题一个农夫带着一只狼,一只羊和一颗白菜过河,从西岸到东岸。船太小,他每次过河只能携带一样东西,船只有农夫能撑。问题是狼会吃羊,羊会吃白菜,所以不能单独让狼和羊或者羊和...原创 2017-11-05 00:57:53 · 12374 阅读 · 1 评论 -
二叉堆排序树的建立和检索【数据结构实践报告】
数据结构实验报告实验名称:实验五 二叉堆排序树的建立和检索学号:***姓名:gnosed实验日期:2017.11.10 一、实验目的1、掌握以堆为序列的二叉堆排序树的建立2、对二叉排序树进行数据检索 二、实验具体内容1、实验题目1:(1)题目构造一棵二叉排序树,并进行遍历,检索数据要求:1、输入数据构造二叉排序树2、对构造好的二叉排序树进行中根序遍历提示:对二叉排序树进行中根序遍历的时候,获得的...原创 2017-11-18 19:22:52 · 1369 阅读 · 0 评论 -
二叉树的建立与遍历【数据结构实验报告】
数据结构实验报告实验名称:实验四 二叉树的建立和遍历学号:***姓名:gnosed实验日期:2017.11.5 一、实验目的1、掌握树的先根构造2、了解树的遍历 二、实验具体内容1、实验题目1:(1)题目构造一棵二叉树,并进行遍历要求:1、二叉树的构造,可以输入树的先根序遍历序列,然后进行构造2、先使用递归的中根,先根,后根序对二叉树做遍历,然后对二叉树进行中根序非递归遍历提示:1、 在构造二叉...原创 2017-11-06 21:20:24 · 48238 阅读 · 2 评论 -
常见排序算法原理及代码示例
声明:为简便描述算法,以下排序对象arr[ ]为整型数组,len为其长度,且按不降序排序。一、插入排序1.直接插入排序1)原理:将数组分为有序和无序两部分,有序部分一开始只有数组的第一个元素。对于无序部分的每个元素,要插入到有序数列中,方法是与有序部分的末尾元素作比较,若前者大于后者则前者位置不变;否则,往前检索,同时将这个元素往后移动(检索一次,移动一次),直到找到这个待插入元素小于...原创 2017-12-10 23:32:53 · 3176 阅读 · 0 评论 -
单向循环链表简单应用
如题,给出n,s,m三个整数。n个人围成一圈,从第s个人开始从1数数,数到第m的人退出圈子,然后从下一个人又开始从1数数,数到第m的人退出。如此循环下去,输出这n个人退出的顺序。解决的一种方法就是应用单项循环链表,进行模拟。代码如下:#include #include #include #include using namespace std;#define pnode st原创 2017-09-21 21:04:13 · 625 阅读 · 0 评论
分享