
数据结构和算法
文章平均质量分 87
C语言或C++语言讲解数据结构和算法相关知识
疯狂嘚程序猿
这个作者很懒,什么都没留下…
展开
-
数据结构---堆的构建和堆排序(向下、向上调整算法)
一、建堆1.堆的概念及性质 如果有一个关键码的集合K = {k0,k1, k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足:Ki <= K2i+1 且 Ki<= K2i+2 (Ki >= K2i+1 且 Ki >= K2i+2) i = 0,1,2…,则称为小堆(或大堆)。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。堆的性质:堆中某个节点的值总是不大于或不小于其父节点的值;堆总是一棵完全二叉...原创 2021-01-09 22:20:16 · 3706 阅读 · 5 评论 -
算法---动态规划(编辑距离、不同子序列、动态规划总结)
第11题:编辑距离第12题:不同子序列原创 2021-05-05 22:19:31 · 361 阅读 · 4 评论 -
搜索算法---深度优先搜索
一、通过下面一个问题总结深度优先搜索问题:有编号为1~3的三张牌和编号为1~3的三个盒子,将三张牌放到三个盒子中且每个盒子只能放一张牌,问:一共有多少种方法?根据题意,每个盒子放的牌有三种可能(1号盒子放的牌可能是1、2或3,2号...)。假定,从1号盒子开始放,接着放2号、3号。 给1号盒子放牌时,由于1号盒子是第一个放的,因此有三种选择:1、2、3号牌。假定,第一次放入1号牌,第二次放入2号牌... 给2号盒子放牌,此时1号盒子已经放入了1号牌,因此2号盒子只能从2、3号盒子选一张牌放入,假原创 2021-06-07 17:26:39 · 5151 阅读 · 0 评论 -
算法---动态规划(背包问题、分割回文串)
第9题:背包问题问题分析思路1状态定义:前i个物品中可装入背包的方案的总价值f(i) 状态之间的转换方程:f(i) = {f(1)+V[i],f(2)+V[i],...,f(i-1)+V[i]} 初始状态:f(1) = V[0] (A[0]<=m) 返回结果:max{f(1),f(2),...,f(i)}思路2:优化算法状态定义 状态之间的转换方程 初始状态 返回结果代码描述第10题:分割回文串II题目分析状态定义 状态之间的转移方程 初始状态 返原创 2021-05-03 12:58:38 · 522 阅读 · 2 评论 -
算法---动态规划 II
动态规划相关问题的讲解,进一步认识动态规划解决问题的基本思路。原创 2021-04-15 21:57:51 · 206 阅读 · 0 评论 -
搜索算法---广度优先搜索
1、员工的重要性2、N叉树的层序遍历3、腐烂的橘子4、单词接龙5、最小基因变化6、打开转盘锁原创 2021-06-16 22:52:58 · 2617 阅读 · 1 评论 -
算法---动态规划 I
一、动态规划问题的一般解决过程1、动归介绍1)动归的定义动态规划时分治思想的眼神,通俗来说就是大事化小,小时化无。再将大问题化解为小问题的分治过程中,保存这些小问题已经处理好的结果供后面处理更大问题时使用这些结果。2)动归的特点把原来的问题分解成了几分相似的子问题 所有的子问题都只需要解决一次 存储子问题的解3)动态规划的本质对问题状态的定义状态转移方程的定义(状态以及状态之间的递推关系)。2、动态规划解题过程动态规划问题一般从以下四个角度考虑:状态定义 状态原创 2021-04-14 18:57:47 · 363 阅读 · 1 评论 -
AVL树
一、AVL树的概念1、什么是AVL树?当数据有序或者接近有序时,使用二叉搜索树进行存储时,得到的二叉搜索树是一颗单支树,其搜索的时间复杂度为O(N)。为了解决上述问题,引入了AVL树的概念:AVL树是一颗特殊的二叉搜索树 向AVL树中插入一个节点后,树的所有节点的左右孩子节点的高度差的绝对值小于等于1. 即AVL树是一颗二叉搜索树是,它的左右子子树的高度之差(平衡因子)的绝对值不大于1,并且它的左右子树也是一颗AVL树。2、AVL树的节点定义template<cla原创 2021-05-26 23:45:23 · 13339 阅读 · 13 评论 -
数据结构---二叉树(树和二叉树的基本概念、堆的概念和堆的实现、堆排序、二叉树的顺序和链式结构及其实现、相关面试题解析)
一、树和二叉树的基本概念和结构1.数的基本概念树:树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 树的根节点:如果一颗树中的某个节点没有前节点,就称该节点为树的前驱节点。一棵树中有且仅有一个跟节点。树的特点:树的任何一颗子树都是互不相交的;除了根节点以外,每个节点有且仅有一个父节点;一棵N个节点的树有N-1条边。1)树的相关概念(蓝色字体为重点)节点的度:一个节点含原创 2021-01-13 18:18:04 · 937 阅读 · 1 评论 -
数据结构---顺序表和链表
一、线性表线性表(linear list)是n个具有相同特性的数据元素的有限序列,是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。二、顺序表1.基本概念2.实现三、链表...原创 2021-01-02 21:20:04 · 892 阅读 · 0 评论 -
数据结构---排序(插入排序、希尔排序、堆排序、选择排序、冒泡排序、快速排序、归并排序、计数排序)
一、插入排序1.基本思想 直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。 插入排序过程如下: 2.直接插入排序 当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与array[i-1],array[i-2],…的排序码顺序进行比较,找到...原创 2021-01-24 12:56:27 · 1061 阅读 · 0 评论 -
C++---二叉搜索树
一、二叉搜索树的概念二叉搜索树又称二叉排序树,它是一颗空树或者是具有以下性质的树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值 它的左右子树也分别为二叉搜索树二、二叉搜索树的操作1、查找基本思路:根节点为空,返回false 根节点不为空,比较根节点和要找的值是否相等,相等返回true。 根节点和要找的值不想等时,判断跟节点和要找的值的关系。 如果根节点小于要找到的值,则在右子树找 如果根节点大于要原创 2021-05-19 15:27:20 · 729 阅读 · 5 评论 -
B树、B+树和B*树
Hash、AVL树、红黑树等结构适用于内查找,当数据量比较大内存中无法加载时,这些数据结构就很难高效的查找。这时,就需要B树来解决。举个例子:我们熟悉的MySql数据库是将数据保存在一个个的table中,再将一个个的table保存在硬盘中的。每一个table都是一个二维结构,即行和列。如果业务比较大的时候,一个数据库中可能会存在很多的table,每个table有有很多的行和列。在MySQL数据库中每一行是一个表项,表示的是同一事务的信息,如果要在table中查找某个数据时我们可以将每个数据的prim原创 2021-08-16 16:09:41 · 573 阅读 · 1 评论 -
数据结构---栈和队列(栈、队列、循环队列)
一、栈1.概念及结构特点 栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。栈的特点:只能在一端进行数据的插入和删除;遵循“先进后出”原则。入栈和出栈操作结构体定义// 支持动态增长的栈typedef int STDataType;typedef原创 2021-01-06 14:22:23 · 1257 阅读 · 0 评论 -
Linux---基础IO
一、文件操作接口1.C语言文件操作接口1)打开文件接口FILE* fopen(const char* path,const char* mode);参数path:待打开的文件(路径+文件名)mode:打开方式r : 以只读方式打开一个文件,如果文件不存在则打开失败。r+:以读写的方式打开一个文件,如果文件不存在则打开失败。w:以只写的方式打开一个文件,如果文件不存在则创建文件;如果文件存在则会清空文件。w+:以读写的方式打开一个文件,如果文件不存在则创建文件;如果文件存在则清原创 2021-01-07 23:52:47 · 829 阅读 · 0 评论 -
哈希的应用
一、位图位图就是指使用一个比特位来表示某种事物的状态,适用于海量数据且无重复的场景,可以极大减少内存空间的使用。1、使用场景1)给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。一个unsigned int 占四个字节的内存空间,49亿个就需要占4*40字节 = 14G,在32位系统中内存一共就4个G,而14个G都无法存储。思路1:将40亿个数据保存在文件中,依次从文件中读取在进行比较。时间复杂度为O(N),读取文件存在IO操作,效率比较低原创 2021-07-21 23:08:14 · 618 阅读 · 0 评论 -
使用红黑树封装map和set
红黑树和AVL树都是二叉搜索树,但是从效率以及实现方式等方面综合来看,红黑树比AVL树更优。也就是说,红黑树是一种更好的,适合搜索的数据结构。同时,红黑树的使用方面非常广泛,Java库、linux内核、c++ST...原创 2021-06-07 20:23:44 · 945 阅读 · 5 评论 -
C++---多态
一、多态的概念1、多态的定义通俗的说,多态就是一个事务的不同形态。即不同的对象完成某个任务的状态。例如,买票时学生票半价,军人优先买票,其他人正常买票。实际上,多态就是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。2、多态的实现1)虚函数使用virtual修饰的类成员函数称为虚函数。class Person {public: virtual void BuyTicket() { cout << "买票-全价" &原创 2021-05-10 17:23:27 · 694 阅读 · 9 评论 -
红黑树简单实现
一、红黑树的概念红黑树是一种二叉搜索树,它的每个节点不是黑色就是宏二、红黑树的插入操作三、红黑树的简单实现原创 2021-05-31 22:41:44 · 374 阅读 · 1 评论 -
简易内存池
目录一、内存池基础知识1、什么是内存池1.1 池化技术1.2 内存池2、内存池的作用2.1 效率问题2.2 内存碎片3、内存池技术的演进二、简易内存池原理1、整体设计2、细节剖析2.1 内存块如何用链表链接3、性能比较三、简易内存池完整源码一、内存池基础知识1、什么是内存池1.1 池化技术池化技术是计算机中的一种设计模式,主要是指:将程序中经常要使用的计算机资源预先申请出来,由程序自己管理,程序在使用时直接从“池”中获取,不仅保证了程序原创 2021-07-01 21:48:02 · 1208 阅读 · 4 评论