随笔分类 - c++数据结构与算法
摘要:一个经典得题目是求平方根(见leetcode第69题) 题目如下,对于某个浮点数x,求其平方根。 方法一:二分法: 这种是最简单的,就是定义一个最小值0和最大值number,把一个数取一个中间值(0+number)/2,然后平方,如果平方大于该数值,就把中间值赋给最大值,否者就把中间值赋给最小值,一
阅读全文
摘要:求图的最短路径,是一种常考算法。通常有两种算法:可以参考下面的博客: https://blog.51cto.com/gelivable/427009 https://blog.csdn.net/zxq2574043697/article/details/9451887 关于迪杰斯特拉算法: 总结:迪
阅读全文
摘要:快速排序作为一种优秀的排序算法,我们先来给出其核心思想:递归的,让正确的元素出现在正确的位置。 也就是快速排序有两大要点: 让正确的元素出于正确的位置 递归 让正确的元素出于正确的位置 比如一组数据:5 7 2 4 3 6 9 8;我们知道当这个数组排好序后: 2出现在索引为0的位置,且它前面的数都
阅读全文
摘要:动态规划通常是一个很难的问题。我先分享一个大V写的文章,大家可以看看人家对于动态规划的理解: https://www.zhihu.com/question/23995189/answer/1094101149?utm_source=com.tencent.tim&utm_medium=social&
阅读全文
摘要:对于两个整形数据:比如int a = 3;int b =4;不借助于第三变量。 有两种方法: 方法1: a = a+b;//a=7 b = a-b;//b=3 a = a-b;//a=4 方法2: a = a^b;//异或运算 b = b^a; a = a^b; 思考上述方法对浮点数成立吗?
阅读全文
摘要:双指针索引技术 数组类问题,我们通常也许会采用单索引来解决问题。但明显有一些问题,采用双索引来解决,似乎具有更优的效果。双索引通常包括碰撞指针和滑动窗口两种形式,无论是哪种形式,都表明了针对某一类问题,我们可以使用双索引的方式来解决这一类的问题。 先给上简书上的一个地址:https://www.ji
阅读全文
摘要:很多算法题中使用位运算能够巧妙的解决很多问题,比如: 找出只出现一次的数 如果数组中只有一个数字出现一次,其他数字都出现两次。试找出这个数据 通常的情况,我们会采用遍历的思路。但是其实不用。因为异或运算有个十分重要的性质:任何一个数字异或它自己都等于0,而0异或任何数都等于那个数。 因此,但凡出现两
阅读全文
摘要:凡是高效的排序算法无疑都是采用了分治的策略。我们先来看一下什么是分治的思想: 分治法,字面意思是“分而治之”,就是把一个复杂的问题分成多个相同或相似的子问题,再把子问题分成更小的子问题直到最后子问题可以简单地直接求解,原问题的解即子问题的解的合并。即,分治法的思想是将原问题拆解成相同或者相似的子问题
阅读全文
摘要:1—一般二分查找 一般的二分查找代码如下: int search(int A[], int n, int target){ int low = 0, high = n-1; while(low <= high) { // 注意:若使用(low+high)/2求中间位置容易溢出 int mid = l
阅读全文
摘要:翻转链表(LeetCode206题) 翻转成 我们思考,当 到底该怎样去思考,思考问题的重心在哪里? 先说结论:思考问题的重心是当前如何处理当前节点? 假设现在当前节点是头结点2,那么当发生翻转到底发生了什么? 如果我们要将节点2指向节点1,但是之前是指向节点3的,为了下次能够访问到节点3,我们应该用一个指针保存节点2的下一个节点。 即首先应该有: Next = current->n...
阅读全文
摘要:二叉搜索树 二叉搜索树很明显来自于一种思想:二分查找。 二叉搜索树 很明显: 二叉搜索树并不要求是一棵完全二叉树 则左子树上所有结点的值均小于它的根结点的值;右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉搜索树。 对于二叉搜索树而言,有以下典型的操作: 1 插入,删除 2 查找 3 遍历:深度优先遍历(包括前序,中序,后序三种方式),广度优先遍历 对于插入而言:...
阅读全文
摘要:在我之前的文章中:《高效排序之——堆排序,归并排序、快速排序》中初步介绍了堆排序的过程,但是认真的说,自己并没有叙述的十分清楚,这篇博客,我将持续更新,表明堆排序的一个过程和核心思想。 系列博客将按照下面三个问题展开: 什么是堆? 为何堆结构可以用来排序? 怎么利用堆结构进行排序? 堆排序的算法性能
阅读全文
摘要:关于多进程创建,此处只讲解一个函数fork(). 1.进程创建 先上代码: 运行结果: 程序及结果分析: 程序分析: pid = fork();//执行fork的时候到底发生了什么? 这行代码到底发生了什么?我们需要清楚:在这行代码执行之前,如果不考虑系统调用这个层次的进程,那么就只有一个进程,就是
阅读全文
摘要:上一篇中讲到暴力法字符串匹配算法,但是暴力法明显存在这样一个问题:一次只移动一个字符。但实际上,针对不同的匹配情况,每次移动的间隔可以更大,没有必要每次只是移动一位: 关于KMP算法的描述,推荐一篇博客:https://blog.csdn.net/weixin_36604953/article/de
阅读全文
摘要:字符串匹配是一项重要的内容,本处我们讨论的字符串匹配是完全匹配,也就是找出子字符串在父字符串中的匹配位置。 例如:父字符串:EDGRNGIGEDEDGEDGLGDEDG,子字符串:EDG;则需要知道“EDG”在父字符串中的位置。先上代码: 需要说明的是:函数BFmatch的返回类型为vector<i
阅读全文
摘要:d动态规划与其说提供了一种算法策略,不如说是提供了一种算法思想。掌握其思想才是最为重要的: 其中这两篇文章描述了动态规划的一些重要东西:http://cppblog.com/menjitianya/archive/2015/10/23/212084.html ;https://blog.csdn.n
阅读全文
摘要:尽管很多人知道哈希表,但并并没有掌握到核心(到目前为止,我也没有)。其实对于哈希的阐述,应该顺着这样的一个结构: 什么是哈希结构? 为什么需要哈希结构? 如何实现哈希结构? 实现哈希结构的过程中会遇到什么问题? 如何解决这些存在的问题? 实际上,学习的每个过程,几乎都遵循着这样的一个逻辑,但是关键在
阅读全文
摘要:递归是一种重要的算法思想,其实现的“简洁性”通常会让人赞美,但不加修饰的递归通常会带来栈空间的爆炸。然而,这并不阻挡人们对递归的探索。 这位作者给出了递归一些典型的案例:https://mp.weixin.qq.com/s/mJ_jZZoak7uhItNgnfmZvQ 这里面讲到了递归的三要素,以及
阅读全文
摘要:除了上一次介绍的希尔排序,堆排序,快速排序,也是经常用到的排序方式,其中快速排序可以说是一种性能十分优秀的排序。 1 堆排序: 针对堆排序,对于其代码实现不作阐述,因为太过于复杂,主要是堆处理的复杂。 在此,对其算法的核心步骤作一定描述: 堆排序,本质上,分为两步: 1 建立堆: 1 广度优先初始化
阅读全文
摘要:希尔排序是一种高性能的排序算法 ,其核心思想在于: 1.将数组分割为若干子数组,对每个子数组进行简单算法排序(如插入,梳排序均可); 2.将排序后的子序列合并,继续重复步骤1; 直到所分的数组为1组。,算法结束。 那么上述中,如何分组呢?分组方式见《C++数据结构与算法》393页最下面的划分方式,当
阅读全文
浙公网安备 33010602011771号