高并发内存池 池化技术在说内存池之前,我们得先了解一下“池化技术”。所谓“池化技术”,就是程序先向系统申请过量的资源,然后自己进行管理,以备不时之需。之所以要申请过量的资源,是因为申请和释放资源都有较大的开销,不如提前申请一些资源放入“池”中,当需要资源时直接从“池”中获取,不需要时就将该资源重新放回“池”中即可。这样使用时就会变得非常快捷,可以大大提高程序的运行效率。在计算机中,有很多使用“池”这种技术的地方,除了内存池之外,还有连接池、线程池、对象池等。
算法——BFS解决FloodFill算法 中文:洪水灌溉。假设这一块4*4的方格是一块土地,有凸起的地方,也有凹陷的地方(凹陷的地方用负数表示)。此时下大雨发洪水,会把凹陷的地方填满。绿色圈起来的属于一块区域(上下左右四个方向,有时候题目也会问八个方向包括斜着相连的),题目会问有多少块区域被填满,或者问被填满的最大区域是哪个;或某一块区域的边长是多少。但是本质都是让我们在一块区域找性质相同的连通块。DFS——深度优先遍历(递归):从某一点开始一条路走到黑。
算法——优先级队列(堆) 每一回合,从中选出两块** 最重的** 石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。拿到数组后先创建一个大根堆,将数组中的数字全部丢入大根堆里,先后两次拿出堆顶元素,让其碰撞,将碰撞后的结果重新放入大根堆中,给定一个单词列表 words 和一个整数 k ,返回前 k_ _个出现次数最多的单词。如果没有石头剩下,就返回 0。返回的答案应该按单词出现频率由高到低排序。排序后第K大的元素,包括相同的元素也统计进去。返回当前数组中的中位数,数组中会一个个添加数字。
算法——栈 接下来开始遍历数字(要把它从字符串中提前出来)当遇到第一个数字时,不要提取,先把他放入栈中,因为我们在数字前面初始化了+,我们不知道数字下一个位置的运算符是什么,如果是乘除,这个数字就要和后面的运算符结合。当箭头移动到4时,此时char里存储的是*,此时把栈顶元素弹出来计算(因为本题中没有括号,乘除法的优先级为最高,所以可以大胆将其弹出进行运算)执行完4*6之后,将24继续放入栈里。刚开始遇到数字,要先把数字提取出来,放到int栈里,碰到左括号,将左括号后的字符提取出来放入string栈里。
算法——字符串 先不处理进位情况。相加完之后再处理进位情况。创建一个长度为m+n-1的数组,让下面的数去乘上面的数,判断放在哪个位置时,就让两个数字下标相加即可。比如用6去乘3,即都是0位置上,最终18就放在数组0下标的位置上。最终处理进位时,就相当于让tmp里的数再和0相加放入ret里就行。最后的最后处理前导0.
算法——哈希表 *是什么:**存储数据的容器:快速查找某个元素,时间复杂度O(1),空间复杂度O(n)**什么时候使用哈希表:**频繁查找某一个数(这里不要忘了之前的二分,时间复杂度O(logN)): 1.容器 2.用数组模拟简易哈希表。
算法——分治 用归并算法给数组排序,首先先选择mid中间点,先把左边部分排序,排左边的时候相当于又是一个归并排序的过程,直至只剩下一个元素的时候,向上返回,排右边区间,直至剩下一个元素时,开始向上返回,当这一层都排完时,合并两个有序数组。当cur1[num] <= cur2[num]:说明此时还没有比cur2位置上大的数,就继续找,直到找到cur1位置大于cur2位置的数,所以让cur1++(本质上是先把cur1位置的数放到辅助数组里面,然后让cur1++)找两个数,使前面的数大于后面的数2倍。该算法是基于快排改良的。
算法——位运算 一大堆数随便异或(不考虑运算顺序),结果是唯一的运用6、7LeetCode191. 位1的个数LeetCode318. 比特位计数LeetCode461. 汉明距离运用9LeetCode136. 只出现一次的数字LeetCode260. 只出现一次的数字III。
算法——滑动窗口 更新结果这一步,需要结合实际题目具体分析,有时候需要进窗口的时候更新结果,有的时候需要出窗口时更新结果,此题出窗口前更新结果。滑动窗口的正确性:利用单调性,规避掉了很多没有必要的枚举时间复杂度:从代码角度看,好像是两层循环嵌套,时间复杂度似乎也是O(n2),但是实际情况我们对窗口进行操作时,left、right每次只移动了一步(即我们的两个指针不回退),最多两个一共移动n+n次,即时间复杂度为O(n)
特殊类设计 new和delete默认调用的是全局的operator new函数和operator delete函数,但如果一个类重载了专属的operator new函数和operator delete函数,那么new和delete就会调用这个专属的函数。将该类的构造函数设置为私有即可,因为子类的构造函数被调用时,必须调用父类的构造函数初始化父类的那一部分成员,但父类的私有成员在子类当中是不可见的,所以在创建子类对象时子类无法调用父类的构造函数对父类的成员进行初始化,因此该类被继承后子类无法创建出对象。
C++智能指针 内存泄漏的问题内存泄漏是指因为疏忽或错误,造成程序未能释放已经不再使用的内存的情况。执行上述代码时,如果用户输入的除数为0,那么div函数中就会抛出异常,这时程序的执行流会直接跳到主函数中的catch块中执行,最终导致func函数中申请的内存资源没有得到释放。利用异常的重新捕获解决对于这种情况,我们可以在func函数中先对div函数中抛出异常进行捕获,捕获后先将之前申请的内存资源释放,然后再将异常重新抛出利用智能指针解决我们使用智能指针试试。
STL—— unordered_set、unordered_map的介绍及使用 unordered_set是不按特定顺序存储键值的关联式容器,其允许通过键值快速的索引到对应的元素。在unordered_set中,元素的值同时也是唯一地标识它的key。在内部,unordered_set中的元素没有按照任何特定的顺序排序,为了能在常数范围内找到指定的key,unordered_set将相同哈希值的键值放在相同的桶中。unordered_set容器通过key访问单个元素要比set快,但它通常在遍历元素子集的范围迭代方面效率较低。它的迭代器至少是前向迭代器。
高阶数据结构——图 图的基本概念图是由顶点集合和边的集合组成的一种数据结构,记作 G = ( V , E ) G=(V, E)G=(V,E)。如下图:带权图示例:如下图:如下图:图的相关应用场景图与树的联系与区别。
认识“协议” 协议,网络协议的简称,网络协议是通信计算机双方必须共同遵从的一组约定,比如怎么建立连接、怎么互相识别等。为了使数据在网络上能够从源到达目的,网络通信的参与方必须遵循相同的规则,我们将这套规则称为协议(protocol),而协议最终都需要通过计算机语言的方式表示出来。只有通信计算机双方都遵守相同的协议,计算机之间才能互相通信交流。