
数据结构与算法
文章平均质量分 69
数据结构与算法
Cloudeeeee
共同成长,共同进步!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【C++基础】函数指针
顾名思义,函数指针是一个指向函数的指针。官方(《C++prime》)的定义如下:如下有一个普通函数:如果想声明 可以 指向该函数的指针的话,则用指针名如 (*p) 替换函数名 lengthCompare 即可,如:如上,p就是一个指向某个(并非一定要指向上面的普通函数,但是它可以指向上面的普通函数)函数的指针,这些函数的返回类型和形参列表都要被限制在函数指针指定的模式下,即函数需要传入两个引用类型的参数,返回的是一个bool类型的值。上面声明了一个函数指针,接下来我们使用如下几种方法使得函数指针指向一个原创 2022-06-24 10:51:46 · 878 阅读 · 1 评论 -
【STL源码剖析】STL六大组件功能与运用(目录)
简介: 各种数据结构,用来存放数据,如vector、list、deque(双端队列)、set、map等等【STL源码剖析】容器(待补充)简介: 各种STL提供的常用算法,如sort、search、copy、erase等等。从实现的角度来看,STL算法是一种方法模板(function template)【STL源码剖析】算法(待补充)简介: 迭代器扮演的是容器和算法之间的粘合剂,是所谓的“泛型指针”。从实现的角度来看,迭代器是一种将operator*,operator->,operator++,operato原创 2022-06-23 14:50:54 · 934 阅读 · 0 评论 -
【STL源码剖析】迭代器
STL的中心思想在于:将数据容器和算法分开,彼此独立设计,最后在以一胶合剂将它们连接在一起。auto_ptr是一种用来包装原生指针的对象,不需要自行释放内存,auto_ptr会自动释放内存,可以解决内存泄漏的问题实现一个迭代器:问题场景: 在算法中需要声明一个迭代器所指对象的类型(我们定义为value type)的变量,如何声明?解决办法: 利用function template的参数推导(argument deducation)机制在STL实现中,traits编程技术得到大量的运用,它利用了“内嵌类型原创 2022-06-23 14:00:00 · 1115 阅读 · 0 评论 -
【STL源码剖析】配置器
“字典”:注释:主要是针对对象的构造和析构,在对象构造前,内存已经分配了,在对象析构后,内存才会被释放。空间的配置与释放的设计哲学:C++内存配置的基本操作 ::operator new() (全局函数)C++内存释放的基本操作 ::operator delete()(全局函数)它们的底层使用的是C语言的malloc()函数和free()函数完成的内存空间的配置与释放SGI的双层级设置器(为了解决碎片空间问题):第一级配置器(__malloc_alloc_template):直接使用 mallo原创 2022-06-23 13:57:34 · 1128 阅读 · 2 评论 -
【STL源码剖析】仿函数
仿函数的作用:STL中提供的各种算法,往往有两个版本,其一就是最直观的默认的运算,其二则是运行用户以 “template参数来指定所要采取的策略” 。例如accumulate(),第一个版本是将指定范围内的所有元素相加,第二个版本则可以传入用户指定的操作,来替换这个相加的过程。要将这种指定的操作当做算法的参数传入算法,唯一的办法是将该操作设计为一个函数,再将函数指针当做算法的一个参数;或者将该操作设计为一个仿函数(实质上是一个class对象),再以该仿函数创建一个对象作为函数的参数传入函数中。仿函数的实质是原创 2022-06-23 13:52:37 · 706 阅读 · 0 评论 -
【STL源码剖析】容器
根据数据在容器中的排列特性,容器可以分为序列式容器和关联式容器:vector 的迭代器需要满足operator++、operator–、operator*、operator->、operator+、operator+=、operator-=等操作,且支持随机存取,因此vector提供的是Random Access Iterators。主要是维护以下三个迭代器:当容量不足时,vector 会扩容至当前的两倍大,如果还不够,就扩张至足够大的容量。扩容并插入 insert_aux() 源码:STL规范: 插原创 2022-06-23 13:49:17 · 865 阅读 · 0 评论 -
【数据结构】红黑树
证明:路径最短 ===》 只有黑色节点路径最长 ===》 每两个黑色节点之间加一个红色节点即:最长路径 = 最短路径 * 2 - 1所有的操作都是在操作一颗BST之后再维护红黑树特有的性质二叉搜索树的性质:左小右大红黑树中经常使用的操作:BST的左旋和右旋重点需要注意经过操作后,红黑树的定义有没有被破坏先按照BST的插入操作进行操作,然后分析如下几种情况。操作: 直接将插入节点的颜色涂成黑色即可(定义1)操作: 直接将插入节点的颜色涂成 红色 即可(为了维护定义5,因此这个新插入的节点不能是黑色)先将此节点原创 2022-06-21 13:01:39 · 1431 阅读 · 0 评论 -
[Java基础] ACM模式下的Java常用输入输出 I/O(持续更新)
[Java基础] ACM模式下的Java常用输入输出 I/O (持续更新)[Java基础] ACM模式下的Java常用输入输出输入1. BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));2. int n = Integer.parseInt(reader.readLine());3. String[] strs = reader.readLine().split(" ");4. arr[i] = In原创 2022-04-09 11:10:50 · 810 阅读 · 0 评论 -
java数据结构安全机制---generic(泛型)
泛型1. 泛型是什么?2. 为什么要用泛型?3. 怎么用泛型?泛型类泛型类的继承泛型接口泛型方法类型通配符泛型擦除泛型与反射1. 泛型是什么?定义: 泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时再为参数指明这些类型。如定义一个类,用<>声明泛型类型,这样的一个类就是泛型类。在上述定义中我们没有指定任何的类型,真正的类型在实例化的时候才进行指定,如:List list = new ArrayList<>();我给它指定了一个Integ原创 2022-03-02 15:40:58 · 635 阅读 · 0 评论 -
java数据结构---PriorityQueue(优先队列,堆)
java数据结构---PriorityQueue(优先队列,堆)1. 什么是PriorityQueue(优先队列,堆)2. 如何使用1. 什么是PriorityQueue(优先队列,堆)普通的队列的性质是先进先出,元素在队列尾加入,在队头弹出。但是在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级的元素先出的行为特征。优先队列的其他用法在此不作解释,此处只解释其作为堆的用法。2. 如何使用PriorityQueue默认为大根堆。创建大根堆Prio原创 2022-01-18 10:48:45 · 810 阅读 · 0 评论 -
C++数据结构---priority_queue(优先队列,堆)
C++数据结构---priority_queue(优先队列,堆)1. 什么是priority_queue(优先队列,堆)2. 如何使用1. 什么是priority_queue(优先队列,堆)普通的队列的性质是先进先出,元素在队列尾加入,在队头弹出。但是在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级的元素先出的行为特征。优先队列的其他用法在此不作解释,此处只解释其作为堆的用法。优先队列含有三个参数:Type, Container, Functional原创 2021-11-23 13:06:10 · 789 阅读 · 0 评论 -
C++---iterator(迭代器)
C++---iterator(迭代器)1. iterator(迭代器)是什么2. iterator(迭代器)怎么用1. iterator(迭代器)是什么iterator(迭代器)类似于指针,通过它,可以访问对象中的元素。2. iterator(迭代器)怎么用定义iterator (容器类名::iterator 迭代器名;)vector<int>::iterator iter;通过迭代器遍历vector avector<int> a;for (iter =原创 2021-11-03 11:05:41 · 580 阅读 · 0 评论 -
C++模板类型---pair
C++模板类型---pair1. pair是什么2. pair怎么用1. pair是什么pair将一对值组合成一个值,这一对值可以具有不同的数据类型,这两个值可以分别用pair的两个公有函数first和second访问2. pair怎么用定义pairpair<int, double> p;访问两个元素pair<int, double> p(2,3.3);// 访问第一个元素cout << p.first << end; // 输原创 2021-11-03 10:31:11 · 294 阅读 · 0 评论 -
C++头文件---algorithm
C++头文件---algorihtm1. 如何使用?algorithm头文件下常用函数1. 如何使用?algorithm头文件下常用函数导入algorithm#include <algorithm> 返回最大值 max();max(); 返回最小值 min()min();逆置 reverse(begin_index,end_index);逆置从起始索引begin_index到终止索引end_index的数reverse(begin_index,end_i原创 2021-10-31 15:59:26 · 4718 阅读 · 0 评论 -
C++数据结构---vector容器
C++数据结构---vector容器1. 什么是vector容器2. 如何使用1. 什么是vector容器向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。它能够存放各种类型的对,可以将向量视为能够存放任意类型数据的动态大小的数组。2. 如何使用导入vector#include < vector> 创建一个vector并命名为Avector<int> A; 增在向量尾部增加一个元素xA.push_b原创 2021-10-29 16:03:40 · 476 阅读 · 0 评论 -
Java常见算法---弗洛伊德算法(环的相关判断)
Java常见算法---弗洛伊德算法(环的相关判断)弗洛伊德算法1. 判断是否有环2. 判断环的入口在哪弗洛伊德算法1. 判断是否有环定义快慢指针,快指针每次走两步,慢指针每次走一步,如果快指针走到了链表的结尾都没有相遇,则无环;如果快慢指针在链表的除了头结点的地方相遇了,则证明有环。public ListNode hasCycle(ListNode head) { // 只有一个节点 if (head == null || head.next == null) return fals原创 2021-10-25 21:19:42 · 726 阅读 · 0 评论 -
Java常见算法---Sort(排序)
Java常见算法---Sort(排序)1. 归并排序1.1 算法思想1.2 代码模板1. 归并排序1.1 算法思想将一组数据分为若干组,再两两合并,直至所有组合并完成,最终得到一个有序的数组。我们以数组[1,8,4,2,9,7,12]为例。首先将数组分为两两一组:[1,8], [4,2] ,[9,7] ,[12]再将其中的数两两排序,得到:[1,8], [2,4] ,[7,9] ,[12]再两两和并(归并排序的重点)(递归),在合并时,用指针 i 指向第一个数组,指针 j 指向第二原创 2021-10-20 15:43:04 · 854 阅读 · 0 评论 -
Java数据结构---Array(数组)
Java数据结构---Array(数组)1. Array(矩阵)1.1 一维数组1.2 二维数组(矩阵)2. 其他操作1. Array(矩阵)1.1 一维数组声明数组dataType[] arrayRefVar; // 如 int[] res ,声明一个名为res的数组创建数组arrayRefVar = new dataType[arraySize]; // 如 res = new int[5] ,创建一个长度为5的数组arrayRefVar = int[]{1, 2, 3 ,4原创 2021-10-11 15:06:31 · 418 阅读 · 0 评论 -
Java数据结构---HashMap(哈希表及其基本操作)(含hashset)
Java数据结构---HashMap(哈希表及其基本操作)1. HashMap简介2. 基础操作(增、删、改、查)3. 其他操作1. HashMap简介HashMap 是一个散列表,它存储的内容是键值(key-value)映射。HashMap 的 key 与 value 类型可以相同也可以不同,根据定义,不受限制。2. 基础操作(增、删、改、查)定义一个哈希表HashMap<Integer, String> hashmap= new HashMap<Integer, Str原创 2021-09-13 16:55:13 · 24901 阅读 · 2 评论 -
Java数据结构---String(字符串及其常用操作)含StringBuffer 和 StringBuilder 类
Java数据结构---String(字符串)1. String简介2. String常用操作1. String简介String,字符串,由若干字符组成的数据结构。最简单的定义方法有:String s = "apple";2. String常用操作返回字符串长度s.length();返回指定索引处的 char 值s.charAt(i); // 索引i从0开始连接字符串str = "hello"s.concat(str); // 得到的值就为 "applehello"原创 2021-08-24 16:14:53 · 605 阅读 · 0 评论 -
Java数据结构---Queue(队列与其基础操作)
文章目录1. Stack(栈)简介2. 基础操作1. Stack(栈)简介队列Queue是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。Queue接口与List、Set同一级别,LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。队列最重要的特点是先进先出(FIFO)。2. 基础操作创建栈// 创建一个空栈Stack<Character> stack=new Stack<>();查看栈原创 2021-08-23 15:27:41 · 456 阅读 · 0 评论 -
Java数据结构---Trie(字典树/前缀树)
Java数据结构---Trie(字典树/前缀树)Trie简介2. 数据结构的构建2. 基础操作(查、增、删)Trie简介前缀树是一种树形结构,在百度中查找一个单词,通常搜索前几个字母,百度就会自动提示后面的字母,即搜索提示,这是前缀树的一个最典型的应用。2. 数据结构的构建前缀树的结点包含属性isclass TrieNode { // 该节点的属性---isWord,它是一个标签,用来表示是否是一个完整的单词 boolean isWord; // 定义该节点的孩子节点 TrieNode[原创 2021-08-12 15:27:42 · 2070 阅读 · 0 评论 -
Java数据结构---BST(二叉搜索树)
文章目录1. List简介2. LinkedList基础操作3. ArrayList基础操作1. List简介List是Java中的一种数据结构。Collection的接口如下图所示。其中List的接口有ArrayList和LinkedList,分别表示顺序表和链表。2. LinkedList链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的地址。链表可分为单向链表和双向链表。基础操作创建链表//原创 2021-08-06 10:30:56 · 436 阅读 · 0 评论 -
Java数据结构---Stack(栈与其基础操作)含单调栈的思想!
文章目录1. Stack(栈)简介2. 基础操作1. Stack(栈)简介Stack是Java中的一种常见的数据结构,Stack在Java中是Vector的一个子类。栈最重要的特点是先进后出。2. 基础操作创建栈// 创建一个空栈Stack<Character> stack=new Stack<>();查看栈是否为空stack.isEmpty();查看堆栈顶部的对象,但不从堆栈中移除它stack.peek();移除并返回堆栈顶部的对象s原创 2021-07-23 15:32:19 · 750 阅读 · 1 评论 -
Java数据结构---List(链表、顺序表的定义及其基本操作)
文章目录1. List简介2. LinkedList基础操作3. ArrayList基础操作1. List简介List是Java中的一种数据结构。Collection的接口如下图所示。其中List的接口有ArrayList和LinkedList,分别表示顺序表和链表。2. LinkedList链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的地址。链表可分为单向链表和双向链表。基础操作创建链表//原创 2021-07-22 10:39:16 · 4026 阅读 · 0 评论 -
树的广度优先搜索(BFS)及其JAVA实现
树的广度优先搜索BFS1. 基本思想思路:输出与当前节点直接相连的节点,直至将与之相连的节点全部输出完,则进入下一层,直至全部节点都被遍历一遍。如图所示有一颗二叉树,根节点为A。输出其广度优先搜索的值。第一步:将A输出,此时输出为A;第二步:将A的左孩子输出,此时输出为A B;再将A的右孩子输出,此时输出为A BC;第三步:此时输出为A BC,而A已经输出了,那么便输出B的左右孩子,此时输出为A BC DE;再输出C的左右孩子,此时输出为A BC DEFG。第四步:再输出D的左右孩子,发现为原创 2021-07-06 09:32:21 · 2376 阅读 · 3 评论