![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
NickChen_0411
学生
展开
-
朴素贝叶斯分类(python实现)
引文:前面提到的K最近邻算法和决策树算法,数据实例最终被明确的划分到某个分类中,下面介绍一种不能完全确定数据实例应该划分到哪个类别,或者说只能给数据实例属于给定分类的概率。基于贝叶斯决策理论的分类方法之朴素贝叶斯优点:在数据较少的情况下仍然有效,可以处理多类别问题缺点:对于输入数据的准备方式较为敏感适用数据类型:标称型数据。朴素贝叶斯的一般过程收集数据:可以使用任何方式准备数据:需...转载 2018-12-25 22:06:51 · 1361 阅读 · 0 评论 -
Bellman-Ford算法原理及练习 || LeetCode 787
There are n cities connected by m flights. Each fight starts from city u and arrives at v with a price w.Now given all the cities and flights, together with starting city src and the destination dst...转载 2018-12-04 21:47:36 · 1532 阅读 · 0 评论 -
贝尔曼-福特(Bellman-Ford)算法——解决负权边(C++实现)
Dijkstra算法虽然好,但是它不能解决带有负权边(边的权值为负数)的图。接下来学习一种无论在思想上还是在代码实现上都可以称为完美的最短路径算法:Bellman-Ford算法。Bellman-Ford算法非常简单,核心代码四行,可以完美的解决带有负权边的图。for(k=1;k<=n-1;k++) //外循环循环n-1次,n为顶点个数 for(i=1;i<=m;...转载 2018-12-04 20:43:20 · 4407 阅读 · 0 评论 -
判断点是否在三角形内
参考文章:https://www.cnblogs.com/graphics/archive/2010/08/05/1793393.htmlhttps://blog.codingnow.com/2018/11/float_precision_problem.html#comment-47738https://www.zhihu.com/question/26022206 重心法:...转载 2018-11-29 21:47:05 · 350 阅读 · 0 评论 -
Kosaraju算法解析: 求解图的强连通分量
参考博客:http://www.cnblogs.com/nullzx/ 1.定义连通分量:在无向图中,即为连通子图。上图中,总共有四个连通分量。顶点A、B、C、D构成了一个连通分量,顶点E构成了一个连通分量,顶点F,G和H,I分别构成了两个连通分量。强连通分量:有向图中,尽可能多的若干顶点组成的子图中,这些顶点都是相互可到达的,则这些顶点成为一个强连通分量。上图中有...转载 2018-11-28 22:10:52 · 747 阅读 · 1 评论 -
POJ 2186 Popular Cows(图论之强连通分量)
强连通分量之于有向图,与并查集之于无向图,在概念上极其相似,都是寻找互相联系的小部分内容。POJ 2186 Popular CowsDescriptionEvery cow's dream is to become the most popular cow in the herd. In a herd of N (1 <= N <= 10,000) cows, you ar...转载 2018-11-28 21:42:20 · 255 阅读 · 0 评论 -
C++实现二叉搜索树的基本功能
文中包括BST的:初始化、析构、插入、删除(重点部分)、清空、查找、先序遍历、中序遍历、后序遍历代码:bst.h#ifndef BST_H#define BST_H#include &lt;iostream&gt;template&lt;typename T = int&gt;class BinaryTree{public: BinaryTree() = defaul...原创 2018-11-17 21:54:18 · 378 阅读 · 0 评论 -
红黑树 C++实现
转载自:http://www.cnblogs.com/skywang12345/p/3624291.html红黑树(Red-Black Tree,简称R-B Tree),它一种特殊的二叉查找树。红黑树是特殊的二叉查找树,意味着它满足二叉查找树的特征:任意一个节点所包含的键值,大于等于左孩子的键值,小于等于右孩子的键值。除了具备该特性之外,红黑树还包括许多额外的信息。红黑树的每个节点上都...原创 2018-11-22 22:26:36 · 210 阅读 · 0 评论 -
哈希表(C++实现)
关于Hash Table, 总结如下:散列表能够实现通过key 对元素的快速访问。 而且易于扩展。 对元素能够实现快速访问(搜索等字典操作), 这是Hash Table 较之于链表的优势所在, 二者均易于扩展。 而易于扩展这个dynamic的结构(使用链接法的时候)又是较之于array的优势所在。 因为数组时不易于扩展的。 使用散列表, 我们需要使用Hash function。 散...原创 2018-11-23 17:42:22 · 8503 阅读 · 1 评论 -
AVL数(平衡二叉树) C++实现
一般的二叉搜索树,在使用的过程中可能会慢慢变得不平衡,这样很可能会降低查找、插入等等的效率,因此我们需要使用算法来实现树的平衡。AVL树是一种比较经典的平衡二叉搜索树,它规定每个节点的左子树和右子树的高度差最多为1,代码如下。(参考博客中对remove函数的书写存在一定的问题,忘记在最后对每个结点进行height的更新,本文代码对此做出来修改,并用实例测试得以验证)avl.h#ifndef A...原创 2018-11-20 22:36:42 · 735 阅读 · 1 评论 -
优先队列(C++自实现)
优先队列(堆)满足先进先出,而且每次出队的都是队列中最小的(也可以是最大的,看实现过程)。堆是一棵完全二叉树,所以优先队列一般用二叉堆实现。分析:1.一棵完全二叉树,所以可以用一个数组表示而不需要用指针。但是用数组就要事先估计堆的大小,所以用一个Capacity表示最大值。2.因为保持堆序性质,最小元就是在根上,删除后还得做一些调整来保持完全二叉树的结构(实际就是删除最后一个元素,然后把它...原创 2018-11-14 21:57:22 · 2276 阅读 · 1 评论 -
并查集 C++
并查集的三种实现方式:一、快速查找QuickFind,用一个数组记录该点所属类别。二、快速合并QuickUnion,用树的形式保存每个点所属类别,每次只连接两个根节点。三、带路径压缩的加权快速合并(Weighted QuickUnion),记录每个树的大小(按照树中结点个数来算),将小数合入大树的根节点,并对大树中的子结点进行路径压缩,让该节点的父节点指向原父节点的父节点。代码:#inc...原创 2018-11-12 21:24:25 · 448 阅读 · 0 评论 -
最大优先队列,最小优先队列使用
greater参数对应最小堆,堆顶元素为最小值;less参数对应最大堆,堆顶元素为最大值。(反着记就行)代码如下:#include &lt;iostream&gt;#include &lt;queue&gt;using namespace std;class node{public: int x,p; node(int a, int b): x(a), p(b) {...转载 2018-11-14 15:46:24 · 729 阅读 · 0 评论 -
堆排序(Heap_Sort)
C++实现堆排序,包括调整堆的过程,以及排序过程。代码:#include &lt;iostream&gt;#include &lt;algorithm&gt;#include &lt;vector&gt;#include &lt;time.h&gt;using namespace std;//使用指针变量进行交换void Swap2(int* a, int* b)原创 2018-11-14 11:56:50 · 947 阅读 · 0 评论 -
最小生成树之普里姆(prim)算法(C++实现)
最小生成树之普里姆(Prim)算法 最小生成树:是在一个给定的无向图G(V,E)中求一棵树T,使得这棵树拥有图G中的所有顶点,且所有边都是来自图G中的边,并且满足整棵树的边权之和最小。如上图给出了一个图G及其最小生成树T,其中红色的线即为最小生成树的边。最小生成树T包含了图G中所有的顶点,且由它们生成的树的边权之和为15,是所有生成树中权值最小的。最小生成树有3个性质:(1)最...转载 2018-12-02 22:54:11 · 3780 阅读 · 0 评论 -
KD-Tree(C++实现)
参考资料:https://blog.csdn.net/dymodi/article/details/46830071https://github.com/WiseDoge/libkdtree作为存取高维数据的一种数据结构,k-d tree 在静态查询和插入方面的效率还是很高的。本文在这里对 k-d tree 的内容作一些介绍,可能也会结合自己使用 k-d tree 的一些体验作一些点评...转载 2018-11-27 18:15:23 · 7102 阅读 · 0 评论 -
图论——拓扑排序(C++实现)
有向无环图 如果一个有向图的任意顶点都无法通过一些有向边回到自身,那么称这个有向图为有向无环图。拓扑排序 拓扑排序是将有向无环图G的所有顶点排成一个线性序列,使得对图G中的任意两个顶点u、v,如果存在边u->v,那么在序列中u一定在v前面,这个序列又被称为拓扑序列。如下图:结点0和1没有前驱节点,可以任意访问,但是结点2必须在结点0和1访问完之后才能访问,同理结点...转载 2018-11-28 11:34:56 · 2917 阅读 · 2 评论 -
线段树的理解(转载)
http://www.cnblogs.com/TenosDoIt/p/3453089.html线段树的精髓在于:对区间做操作,可以高效实现,基本能保持每个操作的复杂度为O(logn) 线段树中的延迟标记概念...转载 2019-01-04 18:09:51 · 187 阅读 · 0 评论 -
CART树用于回归应用(python实现)
一、CART ( Classification And Regression Tree) 分类回归树1、基尼指数:在分类问题中,假设有KK 个类,样本点属于第kk 类的概率为PkPk ,则概率分布的基尼指数定义为: 在CART 分类问题中,基尼指数作为特征选择的依据:选择基尼指数最小的特征及切分点做为最优特征和最优切分点。2、在回归问题中,特征选择及最佳划分特征值的依据是:划分后样...转载 2018-12-24 22:17:31 · 2017 阅读 · 3 评论 -
字符串匹配——KMP(C++实现)
字符串匹配是计算机的基本任务之一。举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"?许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一。它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth。这种算法不太容易理解,网上有很多解释,但读起来都很...转载 2018-12-11 17:50:02 · 1813 阅读 · 0 评论 -
Astar A*算法 最短路径算法
通常情况下,迷宫寻路算法可以使用深度优先或者广度优先算法,但是由于效率的原因,不会直接使用这些算法,在路径搜索算法中最常见的就是A*寻路算法。使用A*算法的魅力之处在于它不仅能找到地图中从A到B的一条路径,还能保证找到的是一条最短路径,它是一种常见的启发式搜索算法,类似于Dijkstra算法一样的最短路径查找算法,很多游戏应用中的路径搜索基本都是采用这种算法或者是A*算法的变种。下面我们来了解...转载 2018-12-10 20:23:31 · 6634 阅读 · 0 评论 -
ID3决策树(python实现)
决策树的生成(该函数是一个递归的过程)CreateTree输入:数据集、特征 输出:字典型数据——决策树 a、判断是否满足停止划分的条件 若当前数据集的属性值为空,则投票表决当前样本中最多的类别 若当前所有的样本类别相同,则返回当前数据的类别。b、寻找当前数据的最佳划分特征 c、将最佳特征作为关键字,保存到字典中 d、从当前的属性集合中删除该最佳特征 e、遍历该最佳划分特征的...转载 2018-12-19 21:59:56 · 756 阅读 · 1 评论 -
KNN(python实现)
kNN算法流程一般情况下,kNN有如下流程: (1)收集数据:确定训练样本集合测试数据; (2)计算测试数据和训练样本集中每个样本数据的距离;常用的距离计算公式: 欧式距离公式:d(x,y)=∑ni=1(xi−yi)2−−−−−−−−−−−−√d(x,y)=∑i=1n(xi−yi)2 曼哈顿距离公式:d(x,y)=∑ni=1|xi−yi|d(x,y)=∑i=1n|xi−yi|(...转载 2018-12-19 21:52:07 · 2587 阅读 · 0 评论 -
SGU326 perspective 最大流 竞赛排名问题
题目大意:有n支NBA球队,这些队伍属于同一个半区,已知各队目前已经赢了几场以及还要打几场(赢了的场次和没打的场次不一定是和 相同半区内的对手),另外已知一个n * n的矩阵,a[i][j]代表i和j还要打的比赛场数。根据这些条件,请问队伍1有没有获得半区冠军的可能性 (若积分相同则均为冠军); 方法:构出图来是四列的网络流问题:第一列为源点,第二列为代表不含1的比...转载 2018-12-06 16:33:36 · 574 阅读 · 0 评论 -
最大流之Ford-Fulkerson算法(C++实现)
本文主要讲解最大流问题的Ford-Fulkerson解法。可是说这是一种方法,而不是算法,因为它包含具有不同运行时间的几种实现。该方法依赖于三种重要思想:残留网络,增广路径和割。一、残留网络顾名思义,残留网络是指给定网络和一个流,其对应还可以容纳的流组成的网络。具体说来,就是假定一个网络G=(V,E),其源点s,汇点t。设f为G中的一个流,对应顶点u到顶点v的流。在不超过C(u,v)的条件...转载 2018-12-06 15:21:30 · 4974 阅读 · 2 评论 -
霍夫曼编码(C++ 优先队列)
霍夫曼编码 一般采用前缀编码 -- -- 对字符集进行编码时,要求字符集中任一字符的编码都不是其它字符的编码的前缀,这种编码称为前缀(编)码。算法思想:构造哈夫曼树非常简单,将所有的节点放到一个队列中,用一个节点替换两个频率最低的节点,新节点的频率就是这两个节点的频率之和。这样,新节点就是两个被替换节点的父节点了。如此循环,直到队列中只剩一个节点(树根)。 其实这就是一个贪心策略,属于...转载 2018-12-12 20:57:51 · 1885 阅读 · 1 评论 -
单源最短路径——迪杰斯特拉(Dijkstra)算法 C++实现
求最短路径之Dijkstra算法Dijkstra算法是用来求单源最短路径问题,即给定图G和起点s,通过算法得到s到达其他每个顶点的最短距离。基本思想:对图G(V,E)设置集合S,存放已被访问的顶点,然后每次从集合V-S中选择与起点s的最短距离最小的一个顶点(记为u),访问并加入集合S。之后,令u为中介点,优化起点s与所有从u能够到达的顶点v之间的最短距离。这样的操作执行n次(n为顶点个数)...转载 2018-12-03 16:24:39 · 11902 阅读 · 0 评论 -
POJ - 3259 Wormholes(多种方法求负权回路)+译文
While exploring his many farms, Farmer John has discovered a number of amazing wormholes. A wormhole is very peculiar because it is a one-way path that delivers you to its destination at a time that i...转载 2018-12-05 20:45:39 · 541 阅读 · 1 评论 -
最短路径---Floyd算法(C++)
Floyd算法的介绍算法的特点: 弗洛伊德算法是解决任意两点间的最短路径的一种算法,可以正确处理有向图或有向图或负权(但不可存在负权回路)的最短路径问题,同时也被用于计算有向图的传递闭包。算法的思路通过Floyd计算图G=(V,E)中各个顶点的最短路径时,需要引入两个矩阵,矩阵S中的元素a[i][j]表示顶点i(第i个顶点)到顶点j(第j个顶点)的距离。矩阵P中的元素b[i][j],表...转载 2018-12-05 20:32:31 · 5623 阅读 · 2 评论 -
最短路径---SPFA算法(C++)
适用范围:给定的图存在负权边,这时类似Dijkstra等算法便没有了用武之地,而Bellman-Ford算法的复杂度又过高,SPFA算法便派上用场了。 我们约定有向加权图G不存在负权回路,即最短路径一定存在。当然,我们可以在执行该算法前做一次拓扑排序,以判断是否存在负权回路,但这不是我们讨论的重点。算法思想:我们用数组d记录每个结点的最短路径估计值,用邻接表来存储图G。我们采取的方法是动态逼近...转载 2018-12-07 23:03:33 · 2409 阅读 · 1 评论 -
最小生成树之kruskal(克鲁斯卡尔)算法(C++实现)
参考博客:https://blog.csdn.net/YF_Li123/article/details/75195549 最小生成树之kruskal(克鲁斯卡尔)算法kruskal算法:同样解决最小生成树的问题,和prim算法不同,kruskal算法采用了边贪心的策略,思想要比prim算法简单。算法基本思想:在初始状态时隐去图中的所有边,这样图中每个顶点都自成一个连通块。之后执行下...转载 2018-12-01 20:58:49 · 4291 阅读 · 0 评论 -
二维凸包求解(Andrew算法 )
Andrew算法是Graham算法的变种。其主要思想为把凸包上的点依次放入栈中,如果发现形成了凹多边形(叉积为负值)就删除一些点,使得又能够维持凸的形态。这时就会发现,处理各个点需要按照x从左往右的顺序,排序即可当然,这只是处理了下凸的一个凸壳,倒过来再刷一次,就得到了整个凸包代码:#include <iostream>#include <cmath>#i...原创 2018-11-13 18:07:28 · 551 阅读 · 0 评论 -
今日头条2018笔试第二题
1.题意:输入一个长度为n个a的字符串,有一下两种操作:1. m = s, s = s * 2;2.s = s + m;初始状态,s = 'a', m = 'a',问至少需要多少步操作,可以得到n个a的字符串。 2.思路:BFS和DFS都可以,但求最少操作数,可先考虑BFS,应为当BFS第一次找到答案时一定为做少的操作情况,且DFS内存容易爆。用pair<int, int>来表示当前...转载 2018-03-25 17:23:13 · 1378 阅读 · 0 评论 -
栈(链表实现)
1.思路 节点结构体为:一个int数值,一个指向下一个节点的指针Struct* next。设定一个链表头节点p,每次入栈的节点都放在p点的下一个节点,前面的节点则依次往后推移一位;每次出栈时将p->next对应节点值输出,并将p->next指向p->next->next;当p->next为nullptr则表明栈为空;当p为nullptr,表明栈不存在。 2.代码#include <iostrea原创 2017-12-11 20:31:05 · 270 阅读 · 0 评论 -
malloc、free用法
malloc用法需要包含头文件:#include ‘stdlib.h’函数声明(函数原型):void *malloc(int size);说明:malloc 向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。从函数声明上可以看出。malloc 和 new 至少有两个转载 2017-12-11 20:08:42 · 433 阅读 · 0 评论 -
随机选择第i小元素
1.思路 采用快速排序中的Partition(int *nArr, int nLeft, int nRight)函数,将数组nArr按照与随机选取Key值的大小关系进行排序,检查比key值所处位置nKey(nKey = nTmpPos - nLeft + 1)和i的关系,如果nKey=i,则返回nArr[nKey];如果nKey>i,则调用Select(nArr, nLeft, nTmpPos-原创 2017-12-11 15:47:20 · 302 阅读 · 0 评论 -
寻找第二小元素
1.思路 一次遍历找到数组中第二小的元素,采用双指针ptr1和ptr2分别指向当前最小和第二小的元素的地址,一次循环,i += 2;数组个数按照奇数偶数进行分类讨论。需要注意指针的使用,避免出现空指针和野指针。 2.代码#include <iostream>#include <vector>#include <ctime>#include <Windows.h>using namespa原创 2017-12-11 11:16:05 · 513 阅读 · 0 评论 -
图像连通域分析(Two-Pass & DFS )
参考博客:http://blog.csdn.net/icvpr/article/details/10259577#reply two-pass法原文中的代码有错误,添加了并查集数据结构后得以解决。 DFS方法无误。 本文代码的作用是,寻找图片中的所以连通域,并保留面积最大的连通域,其他区域删除。#include <iostream> #include <opencv2\highgui\hi原创 2017-12-01 20:30:13 · 2539 阅读 · 2 评论 -
日历计算(C++类实现)
type1:实现某年某月某日往前或往后N天后日历的输出。 type2:实现两个日期之间相差天数的计算。#include <iostream>using namespace std;int monthDays[] = {-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};class Cdata{public: int year, mon原创 2017-12-01 12:39:53 · 893 阅读 · 0 评论 -
桶排序
1.大体思路 桶排序的算法思想:是将阵列分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递回方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。当要被排序的阵列内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n))。但桶排序并不是比较排序,他不受到 O(n log n) 下限的影响。 简单来说,就是把数据分组,放在一个个的桶中,然后对每个桶里面的在进行排序。(原创 2017-12-09 11:36:05 · 288 阅读 · 0 评论