算法
zhcblog
从事云计算分布式存储相关工作
展开
-
kruskal和prim算法如何实现最小生成树
kruskal和prim算法是用来求最小生成树的算法,那什么是最小生成树呢?最小生成树是一副连通加权无向图中一棵权值最小的生成树,也就是图中包含全部节点且权值和最小的连通子图。kruskal和prim算法讲解对于kruskal和prim算法的讲解这里有个秒懂视频,讲解的很详细,可以参考下。kruskal和prim算法秒懂视频kruskal算法实现步骤:将图中的所有边取出并且按权值由小到大排序将已排好序的边从小到大依次还原,若还原的过程中出现环,则舍弃该边重复步骤2直到选出N-1条边为止原创 2020-05-31 10:12:12 · 400 阅读 · 0 评论 -
二叉树的前中后序遍历 (递归和非递归版)
前序遍历若二叉树非空,则执行以下操作:(01) 先访问根节点;(02) 先序遍历左子树;(03) 先序遍历右子树。递归void preorder_bstree(BSTree tree){ if(tree != NULL) { printf("%d ", tree->key); preorder_bstree(tree->l...原创 2020-05-05 16:41:53 · 164 阅读 · 0 评论 -
多重背包 记忆化搜索、动态规划、二进制优化、单调队列优化
题目描述有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是w[i],价值是c[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大W:物品重量V:物品价值C:背包容量N:物品数量1. 记忆化搜索和完全背包一样,只不过在循环结束的时候增加了一个退出条件int dp[60][60];int maxPrix(vector<int...原创 2020-05-01 15:22:59 · 276 阅读 · 0 评论 -
完全背包 推导过程 记忆化搜索、动态规划、时间优化、空间优化
题目介绍有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。1. 暴力递归和01背包一样,只不过是多了一个循环,因为01背包对一个物品最多只要求取一次,而完全背包可以取N次int dp[60][60];int maxPrix(vector<int>&am...原创 2020-05-01 10:34:20 · 529 阅读 · 0 评论 -
01背包 (记忆化搜索、动态规划、一维数组)
题目描述有N件物品,第i件物品的重量是W[i],它的价值是V[i],每件物品数量只有一个,现在给你个承重为C的背包,如何让背包里装入的物品具有最大的价值?1. 暴力递归遇到动态规划问题写不出来的话就写暴力递归int maxPrix(vector<int>& W, vector<int>& V, int C, int i){ if (i == W....原创 2020-04-30 15:08:56 · 575 阅读 · 0 评论 -
LeetCode 股票买卖问题(动态规划)
很多读者抱怨股票系列问题奇技淫巧太多,如果面试真的遇到这类问题,基本不会想到那些巧妙的办法,怎么办?所以本文拒绝奇技淫巧,而是稳扎稳打,只用一种通用方法解决所用问题,以不变应万变。这篇文章用状态机的技巧来解决,可以全部提交通过。不要觉得这个名词高大上,文学词汇而已,实际上就是 DP table,看一眼就明白了。先随便抽出一道题,看看别人的解法:int maxProfit(vector...转载 2020-04-02 21:43:47 · 465 阅读 · 0 评论 -
堆排序
堆结构堆是一种数据结构,它的结构和完全二叉树 一致,分为大顶堆和小顶堆。什么是大顶堆、小顶堆呢?以大顶堆为例,堆顶元素是整个堆内值最大的元素,小顶堆反之保存的是最小的元素。如下图所示:堆结构数据保存堆结构原本是一个完全二叉树的结构,但是这里我们是借用堆来实现对数组的排序,所以我们用数组来保存堆中的数据,比如用下面的数组来保存上面堆结构里的数据:除此之外我们还要知道在数组中如何对节点进行...原创 2020-03-25 18:39:30 · 166 阅读 · 0 评论 -
智能指针
一、什么是智能指针智能指针就是用一个对象维护另一个内存空间,当我们new出一块空间地址后,就不用手动的去delete它,而是交给智能指针帮我们做这件事。简单的说智能指针就是自动的帮我们释放new的内存,而不用手动释放。智能指针实现的原理就是通过调用析构函数来间接释放new的内存。二、auto_ptr使用方法#include <iostream>#include <memo...原创 2020-03-24 21:59:42 · 342 阅读 · 0 评论 -
C++实现智能指针
#include <iostream>#include <memory>using namespace std;// 智能指针自我实现template <typename T>class MyAutoPtr{private: T * _ptr; int * _count;public: MyAutoPtr(T* pt = nullptr)...原创 2020-03-24 21:58:32 · 118 阅读 · 0 评论 -
谢尔排序
算法原理谢尔排序( Shellsort)的名称源于它的发明者 Donald Shell,该算法是冲破二次时间屏障的第一批算法之一,不过,直到它最初被发现的若干年后才证明了它的亚二次时间界。它通过比较相距一定间隔的元素来工作;各趟比较所用的距离随着算法的进行距离减小,直到只比较相邻元素的最后一趟排序为止。由于这个原因,谢尔排序有时也叫作缩减增量排序(diminishing increment s...原创 2020-03-24 21:54:54 · 430 阅读 · 0 评论 -
插入排序
算法特点当数组元素较少、或者数组接近排序时效率较高插入排序为稳定排序算法原理插入排序是一种简单的排序算法之一,它的原理是对一个数组arr从头开始遍历,当前遍历的位置我们记为pos,然后我们一边遍历一边保证pos前面是已经排好序的子数组后面则先不管这样的状态。为了保持这样的状态我们需要这样做:对于当前pos指向的位置我们将它插入到前面已经拍好序的有序子数组里面,但是怎么插入呢?就和你...原创 2020-03-24 21:53:21 · 98 阅读 · 0 评论 -
中缀表达式转后缀表达式
基本操作当读到一个操作数的时候,立即把它放到输出中如果读到一个操作符的时候,那么从栈中弹出栈元素直到发现优先级更低的元素为止如果见到一个右括号,那么就将栈中元素弹出,将符号输出直到遇到一个对应的左括号如果读到末尾,将栈中元素弹出直到该栈变成空栈,将符号写到输出中举个栗子:中缀表达式: a + b * c + ( d * e + f ) * g将该中缀表达式转为后缀表达式:a:...原创 2020-03-24 21:51:50 · 111 阅读 · 0 评论 -
归并排序
合并两个有序数组在讨论归并排序之前我们先来解决下面这个问题:请将下面两个有序数组合并成一个有序数组arr1 = { 4 5 6 9 } ; arr2 = { 2 3 7 10};很显然要合并这两个子数组我们需要用i和j分别指向arr1和arr2从头遍历子数组,并且比较子数组当前位置值的大小,将较小的值赋值到要合并的数组里面然后将对应的i或者j指针向后移动继续遍历就可以了。其实归并...原创 2020-03-24 21:50:06 · 93 阅读 · 0 评论