
算法
文章平均质量分 73
算法
一记绝尘
人的全部本领无非是耐心和时间的混合物
展开
-
数据结构4--递归
递归函数递归的概念递归的定义递归的特点递归过程与递归工作栈汉诺塔问题汉诺塔编程方法八皇后问题问题描述递归分析八皇后编程方法递归的概念递归的定义若一个对象部分地包含它自己,或用它自己给自己定义,则称这个对象是递归的若一个过程直接地或间接地调用自己,则称这个过程是递归的过程。在以下三种情况,常常用到递归方法定义是递归的数据结构是递归的问题的解法是递归的递归的特点递归的基本思想是 自己调用自己例如:数学上最常见、最简单的递归问题就是自然数的阶乘。n=0, n!= 1;n>原创 2021-05-18 12:50:01 · 866 阅读 · 0 评论 -
数据结构3--栈程序演示C语言描述
栈程序示例栈的基本操作包括创建栈压栈出栈清栈遍历输出判断是否为空栈的操作和链表的操作类似若不是很清楚可以看一下链表的笔记:链接: 链表基础知识.#include <stdio.h>#include <malloc.h>#include <stdlib.h>typedef struct Node{ int data; struct Node* pNext;}NODE, * PNODE;typedef struct Stack{原创 2021-05-15 21:55:11 · 132 阅读 · 0 评论 -
数据结构3--栈程序演示(C++)
栈程序演示(C++)main.cpp#include <iostream>using namespace std;#include "Stack.h"int main(){ Stack s1(2); // 创建一个栈,容量为2 s1.push('x'); s1.push('y'); cout << s1.isFull() << endl; cout << s1.getTop() << endl; cout <&l原创 2021-05-16 13:47:02 · 241 阅读 · 0 评论 -
数据结构2--链表
数据结构2--线性存储(2)离散存储--链表离散存储–链表定义: n 个节点离散分配 彼此通过指针相连 每个节点只有一个前前驱节点,每个节点只有一个后续节点 首节点没有前驱节点,尾结点没有后续节点专业术语: 首节点:第一个有效节点 尾节点:最后一个有效节点 头节点:第一个有效节点之前的那个节点,头节点并不存放有效数据,加头节点的目的主要是 为了方便对链表的操作 头指针:指向头节点的指针变量 尾指针:指向尾节点的指针变量确定一个链表需要几个参数:只需要知道头指针分类:原创 2021-05-13 13:53:58 · 302 阅读 · 0 评论 -
数据结构6--字符串
字符串字符串匹配串的逻辑结构串的存储结构模式匹配BF算法KMP 算法KMP 算法思想KMP 算法详解next 数组伪代码描述字符串匹配串的逻辑结构子串:串中任意一个连续的字符组成的子系列主串:包含子串的串子串的位置:子串的第一个字符在主串中的序号S = ‘ab12cd’T = ‘ab12’T = ‘ab13’串的存储结构如何表示串的长度?用一个变量来表示串的实际长度在串尾存储一个不会再串中出现的特殊字符作为串的终止符(\0),表示串的结尾用数组的 0 号单元存放串的长度,从 1原创 2021-08-05 12:24:38 · 340 阅读 · 0 评论 -
数据结构5--队列
队列队列模型队列的顺序存储队列模型队列:只允许在一端进行插入操作,而另一端进行删除操作的线性表允许插入(入队,进队)的一端称为队尾,允许删除(出队)的一端称为队头空队列:不含任何数据元素的队列。.操作特性:先进先出队列的顺序存储顺序存储的改进队头指针 front 指向队头元素的前一个位置,队尾指针 rear 指向队尾元素。特点:从队尾依次入队,从队头依次出队。出队的话,操作 front 指针即可,时间复杂度提高为 O(1),整个队列向数组下标较大方向移动,具有单向移动性原创 2021-05-22 13:33:53 · 425 阅读 · 0 评论 -
数据结构3--用类模板构建通用栈
类模板操作栈前言示例main.cppStack.cppStack.h前言类模板是用于设计结构和成员函数完全相同,但处理的数据类型不同的通用类类模板定义形式:template<class T1,class T2,...>class 类名{ ...};编写通用的栈类成员函数定义示例示例类模板,异常捕获main.cpp#include <iostream>using namespace std;#include "Stack.h"int main(原创 2021-05-16 21:34:00 · 406 阅读 · 0 评论 -
数据结构3--堆栈1
数据结构3--栈和队列1 栈的概念2. 栈的主要操作3. 栈的顺序存储结构及实现3.1 顺序栈4. 栈的上溢与下溢5. 栈类的定义6. 栈的抽象数据类型定义1 栈的概念栈(stack)是操作受限的线性表,插入和删除数据元素只能在线性表的一端进行2. 栈的主要操作操作特性:先进后出所有的操作都是在栈顶的位置进行的3. 栈的顺序存储结构及实现3.1 顺序栈栈的顺序存储结构进栈top 初值为 -1 ,当需要压入一个元素时,top 值先加1,到达数组0的位置,然后在top 所在的原创 2021-05-14 11:16:09 · 614 阅读 · 0 评论 -
数据结构笔记1--线性存储(1)
这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar原创 2021-04-28 19:22:05 · 152 阅读 · 0 评论 -
内存四区
内存四区堆区栈区全局区代码区内存四区模型操作系统把物理硬盘代码 load 到内存操作系统把 C 代码分成四个区操作系统找到 main 函数入口执行堆区一般由程序员分配释放,若程序员不释放,程序结束时可能由操作系统回收注意:它与数据结构中的堆是两回事,分配方式倒是类似于链表栈区由编译器自动分配释放,存放函数的参数值,局部变量的值等, 器操作方式类似于数据结构中的栈。栈区上的变量执行完毕,变量就销毁了。(函数调用完毕,内存就销毁了)全局区数据区:主要包括静态全局区和常量区,如果原创 2021-05-15 09:39:20 · 117 阅读 · 0 评论 -
栈的链式存储
栈的链式存储栈的链式存储结构链栈的实现插入弹出顺序栈和链栈的比较栈的链式存储结构改造链表实现栈的链接存储,将链表头作为栈顶。链栈不需要设头结点链栈:链栈的类声明typedef struct ndoe{ DataType data; struct node *next;}Node;class LinkStack{ private: Node *top; public: LinkStack(); ~LinkStack(); void push(Dat原创 2021-05-17 15:47:25 · 458 阅读 · 0 评论 -
数据结构8--哈夫曼树
哈夫曼树与哈夫曼编码哈夫曼树哈夫曼树原创 2021-08-11 15:29:45 · 9890 阅读 · 0 评论 -
数据结构7--树1
数据结构--树树的逻辑结构树的存储结构笔记来源: 懒猫老师.树的逻辑结构树的定义:n (n≥0) 个结点的有限集合。当n=0时,称为空树,任意一棵非空树满足以下条件:有且仅有一个特定的称为根的结点;当 n > 1 时,除根结点之外的其余结点被分成 m (m>0)个互不相交的有限集合 T1, T2,…Tm,其中,每个集合又是一棵树,并称为这个根结点的子树。树的定义采用递归方法树的基本术语:结点的度:结点所拥有的子树的个数。树的度:树中各结点度的最大值。叶子原创 2021-08-07 20:44:05 · 939 阅读 · 0 评论 -
数据结构7--树2
树树,森林和二叉树的转换树转换为二叉树森林转换为二叉树二叉树转换为树或者森林森林的遍历二叉树遍历的非递归算法前序遍历---非递归算法(也称为先序遍历)中序遍历---非递归算法后序遍历---非递归算法树,森林和二叉树的转换树转换为二叉树如何将树转换成二叉树:加线:树中所有相邻兄弟之间加一条线去线:对树中的每一个结点,只保留它与第一个孩子结点之间的连线,删去它与其他孩子结点之间的连线层次调整:以根结点为轴心,将树顺时针转动一定的角度,使之层次分明兄弟加线保留双亲与第一个孩子连线,删去原创 2021-08-09 19:53:18 · 188 阅读 · 0 评论 -
算法图解部分代码
第一章:算法简介1.2 二分查找1.2 二分查找p7#include<iostream>using namespace std;int main(){ int arr[5] = { 1,2,3,4,5 }; int item = 2; int arrayLen = sizeof(arr) / sizeof(arr[0]); //cout << sizeof(arr) << " " << sizeof(arr[0]原创 2021-08-15 11:48:23 · 253 阅读 · 0 评论 -
趣学数据结构--第九章:排序
排序插入排序直接插入排序交换排序冒泡排序快速排序选择排序简单选择排序插入排序直接插入排序直接插入排序是最简单的排序方法,每次将一个待排序的记录,插入已经排好序的数据序列中,得到一个新的长度增1的有序表。#include <iostream>using namespace std;#define Maxsize 100//直接插入排序void StraightInsertSort(int r[], int n){ int i, j; for (i = 2; i <原创 2021-08-31 17:00:11 · 521 阅读 · 0 评论 -
趣学数据结构--第八章:查找
趣学数据结构第八章:查找线性表查找散列表的查找处理冲突的方法第八章:查找线性表查找散列表的查找处理冲突的方法/*散列表(哈希表)表中包含三行内容:- 哈希地址- 关键字- 比较次数处理冲突的方法:1. 开放地址法:(线性探测法,二次探测法,随机探测法,再散列法)2. 链地址法3. 建立公共溢出区*/#include <iostream>using namespace std;#define m 15 // 哈希表的表长#define NULLKEY原创 2021-08-24 15:28:10 · 313 阅读 · 0 评论 -
趣学数据结构--第六章:树
趣学数据结构---->第六章:树二叉树二叉树二叉树的创建(询问创建以及补空创建),遍历(前序,中序,后序,层序)#include <iostream>#include <queue> // 层序遍历,需要创建队列using namespace std;typedef struct Bnode{ char data; struct Bnode* lchild, * rchild;}Bnode,*Btree;// 创建二叉树// 询问法void原创 2021-08-25 13:47:07 · 347 阅读 · 0 评论 -
趣学数据结构--第三章:栈和队列
第三章:栈和队列原创 2021-08-28 15:19:05 · 469 阅读 · 0 评论 -
趣学数据结构--第五章:数组与广义表
趣学数据结构---> 第五章:数组与广义表数字矩阵(贪吃蛇)数字矩阵(贪吃蛇)#include <iostream>using namespace std;typedef struct{ int x; int y;}Position; // 位置int m[30][30]; // 地图Position here,next1; // 当前位置,下一位置Position DIR[4] = { 0,1,1,0,0,-1,-1,0 };// 右,下,左,上 方向数组原创 2021-08-25 18:52:38 · 167 阅读 · 0 评论 -
趣学数据结构--第四章:字符串
趣学数据结构--->第四章:字符串原创 2021-08-26 16:11:10 · 218 阅读 · 0 评论 -
剑指offer第二版(C++实现)
剑指offer题目原创 2022-06-14 16:46:24 · 3212 阅读 · 0 评论 -
手把手刷数据结构-3.手把手刷二叉树算法2
手把手刷二叉树算法2归并排序二叉搜索树(特性篇)寻找第 K 小的元素BST 转化累加树二叉搜索树(基操篇)在 BST 中搜索元素在 BST 中插入一个数在 BST 中删除一个数二叉搜索树(构造篇)不同的二叉搜索树不同的二叉搜索树II快速排序美团面试官:你对后序遍历一无所知二叉搜索子树的最大键值和归并排序二叉搜索树(特性篇)首先,BST 的特性大家应该都很熟悉了:对于 BST 的每一个节点 node,左子树节点的值都比 node 的值要小,右子树节点的值都比 node 的值大。对于 BST原创 2022-05-01 13:19:46 · 571 阅读 · 0 评论 -
手把手刷数据结构-3.手把手刷二叉树算法1
手把手刷二叉树算法二叉树 (纲领篇)快速排序二叉树解题的思维模式:是否可以通过遍历一遍二叉树得到答案? 如果可以,用一个 traverse 函数配合外部变量来实现,这叫「遍历」的思维模式。是否可以定义一个递归函数,通过子问题(子树)的答案推导出原问题的答案? 如果可以,写出这个递归函数的定义,并充分利用这个函数的返回值,这叫「分解问题」的思维模式。无论使用哪种思维模式,你都需要思考:如果单独抽出一个二叉树节点,它需要做什么事情?需要在什么时候(前/中/后序位置)做? 其他的节点不用你操心,递原创 2022-04-30 15:56:23 · 1387 阅读 · 0 评论 -
手把手刷数据结构-2.手把手刷数组算法2
手把手刷数组算法二分搜索二分查找寻找左侧边界的二分搜索寻找右侧边界的二分查找在排序数组中查找元素的第一个和最后一个位置带权重的随机选择算法二分搜索二分查找链接: 二分查找.class Solution {public: int search(vector<int>& nums, int target) { int left = 0; int right = nums.size() - 1; while (left <原创 2022-04-25 20:10:30 · 753 阅读 · 0 评论 -
手把手刷数据结构-2.手把手刷数组算法1
2.手把手刷数组算法小而美的算法技巧:前缀和数组一维数组中的前缀和二维矩阵中的前缀和小而美的算法技巧:前缀和数组一维数组中的前缀和链接: 区域和检索-数组不可变.class NumArray {private: vector<int> preSum;public: NumArray(vector<int>& nums) { // preSum[0] = 0,便于计算累加和 preSum.resize(nums.s原创 2022-04-23 18:00:45 · 1626 阅读 · 0 评论 -
手把手刷数据结构-1.手把手刷链表算法
手把手刷链表算法双指针秒杀7道链表题目原创 2022-04-20 19:55:18 · 1474 阅读 · 0 评论 -
力扣剑指offer第2版简单题
力扣剑指offer第2版简单题数组中重复的数字替换空格从尾到头打印链表用两个栈实现队列斐波那契数列青蛙跳台阶问题数组中重复的数字先排序,再找重复值class Solution {public: int findRepeatNumber(vector<int>& nums) { sort(nums.begin(),nums.end()); for(int i = 0;i<nums.size();++i)原创 2022-03-26 20:29:48 · 1762 阅读 · 0 评论 -
算法入门第四课
算法笔记3单双链表的反转给定一个单链表的头head,完成链表的逆序调整给定一个双链表的头head,完成链表的逆序调整单双链表的反转给定一个单链表的头head,完成链表的逆序调整相关笔记: C++list容器笔记.非容器方法:#include <iostream>#include <cstdlib>#include <ctime>#include <vector>#include <algorithm>using namespa原创 2022-03-07 18:41:30 · 820 阅读 · 0 评论 -
《软件测试的艺术》2-3章读书笔记
软件测试的艺术2. 软件测试的心理学和经济学2.1 软件测试的心理学2.2 软件测试的经济学2. 软件测试的心理学和经济学2.1 软件测试的心理学每当测试一个程序时,应当想到要为程序增加一些价值。通过测试来增加程序的价值,是指测试提高了程序的可靠性或质量。提高了程序的可靠性,是指找出并最终修改了程序的错误。不要只是为了证明程序能够正确运行而去测试程序;相反,应该一开始就假设程序中隐藏着错误(这种假设对于几乎所有的程序都成立) ,然后测试程序,发现尽可能多的错误。测试定义:测试是为发现错误而执行程原创 2022-03-02 11:21:45 · 776 阅读 · 0 评论 -
算法入门第三课
算法笔记3二分法二分法有序数组中找到num有序数组中找到>=num最左的位置有序数组中找到<=num最右的位置局部最小值为题#include <iostream>#include <cstdlib>#include <ctime>#include <vector>#include <algorithm>using namespace std;//有一个你想要测试的算法,这里以选择排序为例class So原创 2022-02-27 18:42:39 · 788 阅读 · 0 评论 -
算法入门第二课
算法笔记22-1 前缀和数组2-2 随机函数2-1 前缀和数组想要获取数组中某个范围的累加和#include <iostream>using namespace std;int RangeSum(int arr[],int len,int L,int R) // 传入数组,数组长度,从L位置累加到R位置{ int *preSum = new int[len]; // 新建一个数组,存放累加值 preSum[0] = arr[0]; // 0位置的累加是本身,不用再累加,故fo原创 2022-02-23 19:44:32 · 607 阅读 · 0 评论 -
C++ 随机数函数的使用
c++ 随机数随机数1. rand()2.srand()3.使用当前时钟作为随机数种子4.产生随机数的用法5.产生一定范围随机数的通用表示公式随机数计算机的随机数都是由伪随机数,即是由小M多项式序列生成的,其中产生每个小序列都有一个初始值,即随机种子。(注意: 小M多项式序列的周期是65535,即每次利用一个随机种子生成的随机数的周期是65535,当你取得65535个随机数后它们又重复出现了。)我们知道rand()函数可以用来产生随机数,但是这不是真正意义上的随机数,是一个伪随机数,是根据一个转载 2022-02-17 21:02:30 · 1332 阅读 · 0 评论 -
算法入门第一课
算法新手第一课1-1 位运算1-2 什么是算法1-3 算法的分类1-4 求一个数的阶乘累加1-5 选择排序1-6 冒泡排序1-7 插入排序1-8 优化插入排序1-1 位运算打印一个整数的二进制#include <iostream>using namespace std;// 打印一个数的32位二进制// 一个整型的底层就是32进制,32位,long型是64位void printBin(int num){ for (int i = 31; i >= 0; i--) {原创 2022-02-16 21:20:33 · 551 阅读 · 0 评论 -
排序方法总结C++实现
排序方法总结C++实现算法实现冒泡排序插入排序选择排序时间复杂度:反映当数据量变化时,操作次数的多少;时间复杂度在评估时,要只保留最高项,并且不要最高项的系数。时间复杂度的大小比较: N!> x^N >…>3^N >2^N > Nx>…>N3 >N^2>NlogN>N>logN>1空间复杂度:是指算法在计算机内执行时,所需额外开辟的空间。稳定性:稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。不转载 2022-02-16 20:03:14 · 339 阅读 · 0 评论 -
算法与数据结构P2
左神一周刷爆力扣视频P2评估算法的核心指标:时间复杂度(流程决定)额外空间复杂度(流程决定)常数时间项(实现细节决定)何为常数时间的操作?如果一个操作的执行时间不以具体样本量为转移,每次执行时间都是固定时间。称这样的操作为常数时间的操作。常见的常数时间的操作:常见的算术运算(+,-,*,/,%)常见的位运算(>>(带符号右移), >>>(不带符号右移), <<, |, &, ^等)赋值,比较,自增,自减操作等数组寻址操作选原创 2022-02-13 20:58:51 · 187 阅读 · 0 评论