- 博客(275)
- 问答 (1)
- 收藏
- 关注
原创 LeetCode 搜索回溯专题
子集组合问题78. 子集给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。示例 1:输入:nums = [1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]示例 2:输入:nums = [0]输出:[[],[0]]class Solution {public: vector<int> sub = {};
2021-09-15 11:38:32
142
原创 C++之并发编程 第一章 C++并发多线程介绍
1.1 何为并发1.1.1 计算机系统中的并发单个系统中 “同时” 执行多个独立的任务。1.1.2 并发的途径多进程将应用程序分为多个独立的进程,它们同一时刻运行。进程间可以通过一些进程间通信方式(管道、信号、信号量、共享内存、消息队列、套接字等)进行信息传递。优点:操作系统在进程间提供附加的保护操作和更高级别的通信机制,编程简单;可以通过远程连接,在不同的机器上运行独立的进程。缺点:设置复杂、速度慢,运行多个进程需要的开销大。多线程在单个进程中运行多个线程。进程中的所有线程共享
2021-09-13 17:35:06
127
原创 Redis 设计与实现——对象
之前我们整理的内容是Redis用到的数据结构,但是Redis 并没有直接使用这些数据结构来实现键值对数据库, 而是基于这些数据结构创建了一个对象系统, 这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象, 每种对象都用到了至少一种我们前面所介绍的数据结构。Redis 对象的类型与编码Redis使用对象来表示数据库中的键和值,当创建一个键值对时,我们至少会创建两个对象,即键对象和值对象。typedef struct redisObject { // 类型
2021-08-28 22:49:01
115
原创 Redis 设计与实现——跳跃表
跳跃表跳跃表概述跳跃表(skiplist)是一种有序数据结构, 它通过在每个节点中维持多个指向其他节点的指针, 从而达到快速访问节点的目的。Redis 使用跳跃表作为有序集合键的底层实现之一: 如果一个有序集合包含的元素数量比较多, 又或者有序集合中元素的成员(member)是比较长的字符串时, Redis 就会使用跳跃表来作为有序集合键的底层实现。Redis 跳跃表的实现跳跃表是一种可以对有序链表进行近似二分查找的数据结构,redis 在两个地方用到了跳跃表,一个是实现有序集合,另一个是在集群节
2021-08-27 10:35:48
92
原创 C++ STL容器整理
STL有哪些容器?序列容器排序容器哈希容器迭代器序列容器array<T,N>(数组容器)vector<T>(向量容器)deque<T>(双端队列容器)list<T>(链表容器)forward_list<T>(正向链表容器)...
2021-08-22 22:26:34
61
原创 C++ 面试题目整理
C++的多态时如何实现的?C++之多态C++ 一篇搞懂多态的实现原理C++的智能指针C++之智能指针C++中 new 和 malloc 的区别C++中new和malloc的区别C++ 内存管理C++之内存管理C++ 类型转换C++之类型转换C++ 友元友元分为友元函数和友元类。友元函数:在友元函数内部可以访问该类对象的私有成员了。友元类:一个类 A 可以将另一个类 B 声明为自己的友元,类 B 的所有成员函数就都可以访问类 A 对象的private或protected成员
2021-08-18 18:36:15
59
原创 C++之多态
多态指的是同一名字的事物可以完成不同的功能,可以分为编译时的多态和运行时的多态。编译时的多态指:函数的重载(包括运算符的重载),对重载函数的调用在编译时就能根据实参确定应该调用什么函数。运行时的多态:与继承、虚函数等概念有关。当存在类的层次结构并且它们通过继承而相关时,就会发生多态性。通过虚函数进行实现。多态性意味着对成员函数的调用将导致不同的函数执行,这取决于调用函数的对象的类型。举个例子:#include <iostream>using namespace std;//
2021-08-18 18:35:44
82
原创 RabbitMQ
消息系统允许软件、应用相互连接和扩展.这些应用可以相互链接起来组成一个更大的应用,或者将用户设备和数据进行连接.消息系统通过将消息的发送和接收分离来实现应用程序的异步和解偶。RabbitMQ是一个消息代理 - 一个消息系统的媒介。它可以为你的应用提供一个通用的消息发送和接收平台,并且保证消息在传输过程中的安全。AMQP 协议##AMQP 0-9-1 和 AMQP 模型高阶概述AMQP是什么什么是AMQP?AMQP 叫做高级消息队列协议,它是一个网络协议,支持符合要求的客户端应用和消息中间件代理之
2021-08-09 10:31:29
29
原创 Redis 设计与实现——字典
字典字典中,一个键key和一个值value关联起来,这称为键值对。字典中的每个键都是独一无二的, 程序可以在字典中根据键查找与之关联的值, 或者通过键来更新值, 又或者根据键来删除整个键值对, 等等。Redis字典的实现Redis 的字典使用哈希表作为底层实现, 一个哈希表里面可以有多个哈希表节点, 而每个哈希表节点就保存了字典中的一个键值对。哈希表typedef struct dictht { dictEntry **table; // 哈希表数组 unsigned long
2021-08-05 17:57:05
110
原创 Redis 设计与实现——链表
链表链表在 Redis 中的应用非常广泛, 比如列表键的底层实现之一就是链表: 当一个列表键包含了数量比较多的元素, 又或者列表中包含的元素都是比较长的字符串时, Redis 就会使用链表作为列表键的底层实现。redis> LLEN integers(integer) 1024redis> LRANGE integers 0 101) "1"2) "2"3) "3"4) "4"5) "5"6) "6"7) "7"8) "8"9) "9"10) "10"11) "1
2021-08-05 14:29:45
70
原创 Redis 设计与实现——Redis简单动态字符串
Redis简单动态字符串Redis不直接使用C语言传统的字符串表示,而是自己构建了一种名为简单动态字符串(SDS)的抽象类型。而在Redis中,C字符串只会作为字符串字面量。redis> SET msg "hello world"OK那么 Redis 将在数据库中创建了一个新的键值对, 其中:键值对的键是一个字符串对象, 对象的底层实现是一个保存着字符串 "msg" 的 SDS 。键值对的值也是一个字符串对象, 对象的底层实现是一个保存着字符串 "hello world" 的 SDS
2021-08-05 14:06:25
73
原创 Linux内核设计与实现——第9章第10章 内核同步介绍与方法
内核同步介绍本章的意义何在?因为目前内核支持多处理器,所以共享资源一定要防止并发访问,如果多个执行线程同时访问和操作数据,就可能发生各线程之间相互覆盖共享数据情况,造成被访问数据处于不一致状态,因此我们要了解Linux内核如何解决同步问题和防止产生竞争条件。1 临界区和竞争条件临界区:访问和操纵共享数据的代码段。为了避免在临界区中并发访问,我们必须保证这些代码原子地执行,即操作在执行结束前不可被打断。但是如果发生两个执行线程处于同一个临界区中同时执行,就称为 竞争条件 ,这种情况可能会导致错误,
2021-06-16 17:19:51
56
原创 Linux内核设计与实现——第七章 中断和中断处理
为什么要有中断机制?计算机有很多的硬件设备,如硬盘、键盘、鼠标等,操作系统需要对这些硬件设备进行管理,然而处理器的速度和外围硬件设备的速度往往不在一个数量级上。如果内核让处理器向硬件发出一个请求,然后专门等待回应,性能会很差。内核应该在此期间处理其他事务,等到硬件真正完成请求的操作后再回头对它进行处理。因此,采用一种机制让硬件在需要的时候向内核发出信号。1 中断中断本质就是一种特殊的电信号,由硬件发向处理器。内核随时可能因为新到来的中断被打断。不同设备对应的中断不同,每个中断都通过唯一的一个数字标识
2021-06-13 17:51:41
89
原创 Linux内核设计与实现——第五章 系统调用
主要介绍Linux系统调用的规则和实现方法。1 与内核通信系统调用在用户空间进程和硬件设备之间添加一个中间层,其作用有:为用户空间提供了一种硬件的抽象接口系统调用保证系统的稳定和安全在Linux中,系统调用是用户空间访问内核的唯一手段,也是除异常和陷入外,内核唯一的合法入口。2 API、POSIX 和 C 库一般情况,应用程序通过API而不是直接通过系统调用编程。而最流行的应用编程接口是基于POSIX标准,是由IEEE的一组标准组成,目标是提供一套大体上基于Unix的可移植操作系统标
2021-06-01 21:02:08
65
原创 LeetCode 前缀和问题
一维前缀和连续子数组问题很多连续子数组问题都可以使用一维前缀和进行解决,1、连续子数组和问题给定一个数组和目标值,求连续子数组的和等于目标值的个数。数组中的值都大于0这种题就比较简单,可以使用双指针来判断。def solve(nums, target): n = len(nums) if n == 0: return 0 if target == 0: #如果都为正数,不可能和为0 return 0 l, r = 0,0 #
2021-06-01 10:06:35
189
原创 LeetCode 动态规划专题
这是整理的LeetCode上的动态规划专题,按照codeTop上的频率顺序从高到低进行整理并按照别人整理的再次整理。
2021-06-01 10:02:49
69
原创 LeetCode 二分专题
这是整理的LeetCode上的二叉树专题,先按照codeTop上的频率顺序从高到低进行整理,然后按别人整理的进行再次整理。
2021-06-01 10:00:16
118
原创 LeetCode 位运算专题
477. 汉明距离总和两个整数的 汉明距离 指的是这两个数字的二进制数对应位不同的数量。计算一个数组中,任意两个数之间汉明距离的总和。示例:输入: 4, 14, 2输出: 6解释: 在二进制表示中,4表示为0100,14表示为1110,2表示为0010。(这样表示是为了体现后四位之间关系)所以答案为:HammingDistance(4, 14) + HammingDistance(4, 2) + HammingDistance(14, 2) = 2 + 2 + 2 = 6.在计算汉明距离时
2021-05-28 10:06:45
38
原创 LeetCode 字符串专题
字符串相加给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。提示:num1 和num2 的长度都小于 5100num1 和num2 都只包含数字 0-9num1 和num2 都不包含任何前导零你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式// 模拟整数相加class Solution {public: string addStrings(string num1, string num2) { string.
2021-05-27 11:12:37
37
原创 C++之类型转换
类型转换隐式转换先根据类型转换规则将运算对象的类型统一后再求值。算术转换:把一种算术类型转换成另一种算术类型。整型提升:将小整数类型转换成较大的整数类型。显式转换显式地将对象强制转换成另一种类型。命名的强制类型转换 cast-name<type>(expression); 其中,type为转移的目标类型,expression是要转移的值,cast-name是static_cast, dynamic_cast, const_cast, reinterpret_cast的一种。sta
2021-05-25 10:50:07
53
原创 C++ 内存管理
我查了一些资料发现C++内存结构有如下两种说法:栈、堆、全局或静态区、常量区、代码区栈、堆、全局或静态区、常量区、自由存储区两种说法的区别在于代码区和自由存储区,而实际上自由存储区我们可以假定它和堆区没有本质的区别,但是需要知道:堆区是操作系统维护的一块内存,其由程序员自己创建并维护,使用C语言中的malloc 库函数 就可以从堆上动态分配内存;而到了C++我们有一种 关键字 叫做 new ,它是在自由存储区上为对象动态分配内存,它完成两件事,首先底层调用malloc分配内存,然后调用构造函
2021-05-25 10:44:21
29
原创 C++之智能指针(shared_ptr, unique_ptr, weak_ptr)
动态内存与智能指针C++动态内存是通过new(在堆中为对象分配空间并返回一个指向该对象的指针)和delete(接受一个动态对象指针并销毁它释放内存)完成。使用动态内存容易出问题:会忘记释放内存从而内存泄漏在还有指针引用内存时候就释放了它从而产生引用非法内存的指针。C++11 提供了两种智能指针类型来管理动态对象。它与普通指针类似,只是它负责自动释放所指向的对象。shared_ptr类多个指针指向同一个对象,当指向一个对象的最后一个shared_ptr被销毁时,shared_ptr类会
2021-05-25 10:17:59
100
1
原创 高性能MySQL——第五章 创建高性能的索引
什么是索引?索引在MySQL中也叫作“键 key”,它是存储引擎用于快速找到记录的一种数据结构。当表中数据量越来越大,索引就非常重要!!索引优化是对查询性能优化最有效的手段(可以提高几个数量级)。索引基础索引就像一本书的目录,想要理解索引,最简单的方法就是去看看《高性能MySQL》这本书的“索引”部分,找到对应的页码。在MySQL中,存储引擎用类似的方法使用索引,其先在索引中找到对应值,然后根据匹配的索引记录找到对应的数据行。对于这段sql语句查询:SELECT first_name FR
2021-05-24 21:10:12
73
原创 手撕排序
快排void quick_sort(vector<int>& nums, int l, int r){ if(l < r){ int i = l, j = r; while(i < j){ while(i < j && nums[j] >= nums[l]) --j; // nums[l] 作为分界 while(i < j && num
2021-05-12 13:39:38
46
原创 Linux内核设计与实现——第四章 进程调度
调度程序负责决定将哪个进程投入运行,何时运行和运行多长时间。进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子系统。多任务多任务操作系统就是能同时并发地交互执行多个进程的操作系统。多任务系统分类两类:非抢占式多任务除非进程自己主动停止运行,否则它会一直执行。进程主动挂起称为“让步”抢占式多任务在此模式下,由调度程序来决定什么时候停止一个进程的运行。这种强制的挂起动作叫“抢占”。进程被抢占前有一个预先设置好的时间——进程的时间片,它是分配给每个可运行进程的处理器时间段
2021-05-11 17:29:10
76
原创 LeetCode 异或题
首先介绍一下异或运算:异或的一些性质:x XOR y = z,那么 x = y XOR z。x XOR x = 0x XOR 0 = x1720. 解码异或后的数组未知 整数数组 arr 由 n 个非负整数组成。经编码后变为长度为 n - 1 的另一个整数数组 encoded ,其中 encoded[i] = arr[i] XOR arr[i + 1] 。例如,arr = [1,0,2,1] 经编码后得到 encoded = [1,2,3] 。给你编码后的数组 encoded 和原数组 a
2021-05-11 09:56:43
145
原创 高性能MySQL——第三章服务器性能剖析
常见的三个性能相关的服务请求:如何确认服务器是否达到了性能最佳的状态找出某条语句为什么执行不够快诊断被用户描述成“停顿”、“堆积”或者“卡死”的某些间歇性疑难故障事实证明,可以通过一种简单的方法来发现一些苗头:专注于测量服务器的时间花费在哪,使用的技术是 性能剖析 。性能优化简介这里将性能定义为:完成某件任务所需的时间度量,即响应时间。性能优化假设就是在一定的工作负载下尽可能降低响应时间。如果目标是降低响应时间,那么就需要理解为什么服务器执行查询需要这么多时间,然后去减少或者消除那些对
2021-05-10 20:44:46
49
原创 高性能MySQL——第二章 MySQL 基准测试
基准测试是针对系统设计的一种压力测试,通常目标是为了掌握系统的行为。为什么要基准测试?验证基于系统的一些假设,确认这些假设是否符合实际情况。重现系统中的某些异常行为,以解决这些异常。测试系统当前运行情况。如果不清楚系统当前的性能,就无法确认某些优化的效果如何。也可以利用历史的基准测试结果来分析诊断一些无法预测的问题。模拟比当前系统更高的负载,以找出系统随着压力增加而可能遇到的扩展性瓶颈。规划未来的业务增长。测试应用适应可变环境的能力。测试不同的硬件、软件和操作系统配置。证明新采购的设备配
2021-05-10 19:14:54
34
原创 高性能MySQL——第一章 MySQL 架构与历史
本章主要了解:MySQL的服务器架构各种存储引擎之间的主要区别这些区别的重要性MySQL 逻辑架构一共三层服务:最上层并不是MySQL独有,大多基于网络的客户端/服务器的工具或服务都有类似架构。第二层包含了大多数MySQL的核心服务功能。包括查询解析、分析、优化、缓存以及所有的内置函数(例如,日期、时间、数学和加密函数),所有跨存储引擎的功能都在这一层实现:存储过程、触发器、视图。第三层包含了存储引擎。存储引擎负责MySQL中数据的存储和提取。服务器通过API与存储引擎进行通信,存储
2021-05-09 20:21:28
148
4
原创 Linux内核设计与实现——第三章 进程管理
进程定义何为进程?就是处于执行器的程序。但不仅仅局限于一段可执行程序代码,通常还包括其他资源,如打开的文件、挂起的信号、内核内部数据、处理器状态、一个或多个具有内存映射的内存地址空间及一个或多个执行线程,还包括用来存放全局变量的数据段等。(即 程序不是进程,进程是处于执行期间的程序及相关资源的总称)何为线程?执行线程就是在进程中活动的对象。每个线程都拥有一个独立的程序计数器、进程栈和一组进程寄存器。内核调度的对象是线程。对于Linux而言,线程和进程并不区分,可以说线程只不过是一种特殊的
2021-05-08 21:36:03
82
原创 Spark(Python版)——Spark概述
Spark 概述运行速度快容易使用Spark本质上计算模式也是MapReduce,但是操作不局限于Map和Reduce两个操作,提供了更多的操作类型。而且Spark会存储在内存中,磁盘IO开销很小。Spark 生态系统大数据处理主要包括:复杂的批量数据处理基于历史数据的交互式查询基于实时数据流的数据处理过去我们需要同时部署三种不同的软件,如MapReduce、Impala、Storm会存在如下问题:不同场景之间输入输出数据无法做到无缝共享,通常需要进行数据格式的转换。不同的软件
2021-05-08 19:41:59
2651
2
原创 LeetCode 滑动窗口专题
3. 无重复字符的最长子串给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: s = “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: s = “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入: s = “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。请注意,你的答案必须是 子串 的
2021-05-05 21:37:52
61
原创 Linux内核设计与实现——第一章 Linux内核简介
1.1 UnixUnix系统是一个强大、健壮和稳定的操作系统。因为它:Unix很简洁。仅提供几百个系统调用。在Unix中,所有的东西都被当做文件对待。这种抽象使对数据和对设备的操作是通过一套相同的系统调用接口来进行的。Unix的内核和相关的系统工具软件是用C语言编写而成,因此被广大开发人员接受。Unix的进程创建迅速,并且有 fork() 系统调用。Unix提供一套非常简单但又很稳定的进程间通信元语。1.2 LinuxLinux是类Unix系统,但不是Unix,因为它没有直接使用Unix
2021-05-05 20:03:56
43
原创 Spark(Python版)——大数据技术
大数据关键技术分布式存储解决数据存储问题GFSHDFSBigTableHBaseNoSQL分布式处理解决数据高效计算问题MapReduceSpark大数据计算模式不同的计算模式需要使用不同的产品批处理计算:MapReduce、Spark流计算:需要实时处理,给出实时响应(Storm,Flume)图计算:如社交网络数据查询分析计算:Dremel、HiveHadoop它不是单一产品,是一个完整的生态系统。HDFS 是一个分布式文件系统,用来海量分布式文
2021-04-30 16:11:24
214
3
原创 LeetCode 单调栈专题
84. 柱状图中最大的矩形给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。示例:输入: [2,1,5,6,2,3]输出: 10第一种解法:暴力(超时)。我们可以遍历每个柱子,求得以当前柱子高度的最大面积矩形,以当前柱子开始,从左扫描,从右扫描,直到
2021-04-14 16:50:11
148
原创 C++ primer课后习题第六章
6.6#include<iostream>using namespace std;size_t count_add(int n) { // n为形参 static size_t ctr = 0; // ctr为局部静态变量 ctr += n; return ctr;}int main(){ for (size_t i = 0; i != 10; ++i) { cout << count_add(i) << endl; } return 0;
2021-04-05 21:02:00
28
原创 146. LRU 缓存机制
运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。实现 LRUCache 类:LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。void put(int key, int value) 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达到上限时,它应该在写入新数据之前删除最
2021-03-14 15:51:41
60
原创 SQL必知必会 第17课 创建和操纵表
17.1 创建表一般有两种创建表的方法:多数DBMS都具有交互式创建和管理数据库表的工具;表也可以直接用SQL语句操纵。用程序创建表,可以使用SQL的create table 语句。不同的SQL实现中,create table 语句的语法可能有所不同。表创建基础利用create table创建表,必须给出如下信息:新表的名字,在关键字create table之后给出表列的名字和定义,用逗号分隔有的DBMS还要求指定表的位置# 创建products表 create table p
2021-03-14 10:59:56
59
空空如也
Ubuntu 16.04 双屏问题(一个竖屏一个横屏)有bug
2019-11-28
TA创建的收藏夹 TA关注的收藏夹
TA关注的人