![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
Sahm5k
这个作者很懒,什么都没留下…
展开
-
堆排序xx
堆排序主要分为堆的建立,堆的排序两大部分。堆的建立主要由堆的调整遍历形成。堆的调整给定一个堆,根节点下标为t总长度为len,从根到叶子节点逐层调整以大根堆为例:void Adjust_heap(vector<int>& a, int t, int len) { a[0] = a[t];//用空着的a[0]存放根节点 //i的初始值为t节点的左子节点 for (int i = t * 2; i <= len; i = i * 2) {原创 2021-09-27 23:52:10 · 83 阅读 · 0 评论 -
二分查找-进阶版本
二分查找标准的二分查找可以用来查找有序线性表中的值,如果查找成功返回index下表,失败则返回-1.标准二分查找模板:int Binary_search(vector<int>& t, int i, int j,int target) { int left = i, right = j; int mid=-1 ; while (left <= right) { mid = (left + right) / 2;原创 2021-09-27 12:58:07 · 267 阅读 · 0 评论 -
KMP算法查找匹配串
1.问题在主串中查找是否存在某模式串(子串),例如“abcdef”中是否存在子串“cd”?2.匹配算法1.暴力匹配利用双指针逐项的进行匹配,算法时间复杂度为O(n*m),其中n为主串长度,m为子串长度。如果主串或子一长,复杂度是非常糟糕的,由此产生了KMP算法进行串模式匹配。2.KMP算法基本原理:若子串为“ABAB”,主串为"ABACABAB"首先将子串与主串对其进行匹配,ABACABABABAB会发现第4位的C与B失配,这个时候我们要将ABAB向右移动,进行第二轮匹配,如果是暴力原创 2021-09-13 23:01:58 · 70 阅读 · 0 评论 -
最小生成树-Kruskal算法
1.定义prime算法是按照点与点之间的最小权值逐次将点加入到生成树中,而Kruskal算法则是按照每条边的长度依次排序,将最短的边中对应的点加入到最小生成树中,最小生成树的用并查集来表示。1.Kruskal算法是以 边 为基础,每次从 边 集合中寻找最小的边(不管两个顶点属于V还是Vnew),然后判断该边的两个顶点是否同源(属于同一个连通分量)。 2.Kruskal需要对所有的边进行排序,然后从小到大,依次遍历每条边,同时判断每条边是否同源,如果同源,跳过;如果不同源,将两个连通分量合并,直到原创 2021-01-22 22:58:19 · 174 阅读 · 0 评论 -
prime算法-构造最小生成树
1.算法原理将所有节点分成两个集合V,U。在带权连通图中V是包含所有顶点的集合,U是已经在最小生成树中的节点;(1)初始时,从图中任意某一顶点v开始,此时集合U={v}(以v到其他顶点的所有边为侯选边);(2) 在所有u∈U,w∈V-U的边(u,w)∈E中找到一条权值最小的边,将(u,w)这条边加入到已找到边的集合,并且将点w加入到集合U中,(3)重复上一操作,当U=V时,就找到了这颗最小生成树总而言之,每次查找U中的点与V-U中点路径权值最小的边,再将这条边连接的V-U中的点加入到最小生原创 2021-01-20 19:24:40 · 667 阅读 · 0 评论 -
cpp-并查集
并查集定义定义引用百度百科:并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。这一类问题近几年来反复出现在信息学的国际国内赛题中,其特点是看似并不复杂,但数据量极大,若用正常的数据结构来描述的话,往往在空间上过大,计算机无法承受;即使在空间上勉强通过,运行的时间复杂度也极高,根本就不可能在比赛规定的运行时间(1~3秒)内计算出试题需要的结果,只能用并查集来描述。简单的原创 2021-01-16 18:08:28 · 227 阅读 · 0 评论 -
二叉树基础
1.二叉树注:图来自STL源码解析-侯捷二叉树:每个节点包含一个左子节点,一个右子节点。左右子节点均可能为空。2.二叉搜索树定义:任何节点满足:左节点值<本节点值<右子节点值性质:从根节点一直找其左子节点,找到最后就是二叉搜索树的最小节点。从根节点一直找其右子节点,找到最后就是二叉搜索树的最大节点。插入、访问时间O(log n)最坏情况访问时间为O(n),在若干次操作后二叉搜索树变成单边(全部在左节点或者右节点)插入操作:删除操作:3.平衡二叉树平衡的原创 2020-11-22 11:19:13 · 189 阅读 · 0 评论 -
跳表c++实现
原理:https://blog.csdn.net/u013011841/article/details/39158585一.跳表结构1.节点//节点class node { int val; int level;//节点的高度(层次) node* forword[MAXLEVEL];//指向node*的数组};2.skiplist(管理整个表的一个数据结构)class skiplist {private: node* head;//指向跳表的头结点 int max_length原创 2020-10-07 21:39:04 · 539 阅读 · 0 评论 -
回溯算法
1.定义回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。许多复杂的,规模较大的问题都可以使用回溯法,有“通用解题方法”的美称。ps:回溯法是一种暴力求解的方法,类似于多层for循环。如果没有剪枝操作的话,时间复杂度原创 2020-08-28 08:05:27 · 391 阅读 · 0 评论 -
动态规划-二叉树版本-337. 打家劫舍 III
题目源自LeetCode 337.打家劫舍三题干:在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。解析:这是一道经典的动态规划题,很容易就想到动态规划,可是因为是二叉树,dp实现比较特殊原创 2020-08-05 20:47:33 · 275 阅读 · 2 评论 -
二分查找
做题的时候无意中发现了二分查找算法不合理的地方,如果要查找的数值在最左端或者最右端,二分查找是找不到的。引用一下网上的二分代码:他并没有检测l==r(要查找的值在最右边的情况)int binarySearch1(int a[], int n , int target)//循环实现{ int low = 0 ,high = n , middle; while(low < high) { middle = (low + high)/2; if(target == a[原创 2020-07-20 08:22:20 · 104 阅读 · 0 评论 -
逆向动态规划-地下城救公主
题目来自力扣.174,一道很经典的动态规划题目一些恶魔抓住了公主(P)并将她关在了地下城的右下角。地下城是由 M x N 个房间组成的二维网格。我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0 或以下,他会立即死亡。有些房间由恶魔守卫,因此骑士在进入这些房间时会失去健康点数(若房间里的值为负整数,则表示骑士将损失健康点数);其他房间要么是空的(房间里的值为 0),要么包含增加骑士健康点数的魔法球原创 2020-07-14 08:58:32 · 343 阅读 · 0 评论 -
c语言归并排序
归并排序原理:将数组中的数通过递归分开,再两两组合(并),在并起来的时候通过merge函数进行排序。merge函数:将数组分成两个部分([low,mid] [mid+1,hight]),其次根据两部分的最左边的数字大小排序,例如数组a:1,3,5,2 分成两部分为13|20,排列过程:1>2>0>3 void merge(int low, int mid, int ...原创 2020-02-07 19:58:37 · 385 阅读 · 0 评论 -
c语言快速排序quicksort
快速排序原理:每次定一个基准,将数组里的所有数按照大小排列,比基准小的在左边,比基准大的在右边,再通过向左递归,向右递归即可完成快速排序。#include<iostream>#include<deque>#include<vector>#include<memory>using namespace std;vector<int&...原创 2020-02-05 11:56:24 · 393 阅读 · 0 评论