- 博客(176)
- 收藏
- 关注
原创 C++刷题学习笔记目录
刷题笔记为找工作做准备,记录刷题心得与代码力扣系列目录刷题笔记一、数组【283】移动零二、字符串字符串匹配KMP算法一、数组【283】移动零二、字符串字符串匹配KMP算法
2020-10-10 19:58:25 660 6
原创 【for update】解析 【线程安全】【分布式锁】
for update是一种DML操作级别的行级锁。在结合事务的场景中,事务A对一行数据使用select … for update加锁,其他事务只能查询但不能更新被加锁的数据行,而事务A既可以查询又可以更新该行数据。事务A提交后,其他事务才可以更新该行。
2023-03-12 21:11:34 1050 1
原创 《MySQL是怎样运行的》【第19章 redo日志】笔记--【redo日志特性、分类、写入、刷盘时间、日志文件组】【Mini-Transaction(MTR)】
第19章 redo日志前导知识增删改查的本质都是访问页面(读写、创建新页面等)如果仅仅修改某个页面的一个字节,也需要将一个完整的页面从内存刷到磁盘中,这种情况刷新一个完整的数据页太浪费了一个事务修改的多个页面可能并不相邻。导致随机I/O增多what没有必要在每次提交事务的时候就把该事务对应的修改页面全部刷新到磁盘,只要把修改记录下来就好依靠redo log,系统在崩溃重启后按照里面的内容重新更新数据页就能实现事务的持久性redo日志本质上是在记录事务对数据库进行了
2021-12-03 22:52:11 259
原创 《MySQL是怎样运行的》【第18章 事务】笔记
第18章 事务四大特性原子性(Atomicity)一致性(Consistency)隔离性(Isolation)持久性(Durability)what需要保证ACID特性的一个或多个数据库操作称为事务(transaction)事务的状态活动(active)部分提交(partially committed)失败(failed)中止(aborted)提交(committed)流程开启事务begin;start transaction;提交事务commit;不显
2021-12-01 23:10:09 290
原创 《MySQL是怎样运行的》【第16章 optimizer trace】【第17章 缓冲池(Buffer Pool)】笔记
第16章 + 第17章optimizer tracewhat可以让用户查看优化器为指定语句生成执行计划的过程步骤打开optimizer trace功能输入查询语句从OPTIMIZER_TRACE表中查看上一个查询的优化过程关闭optimizer trace功能缓冲池(Buffer Pool)前导知识InnoDB处理客户端的请求时,如果需要访问某个页的数据,会将完整的页中的数据全部加载到内存中将整个页加载到内存中就可以进行读写访问了,而且读写访问之后不着急释放该页对应的内存,
2021-11-30 22:27:45 858
原创 《MySQL是怎样运行的》【第14章 查询优化】笔记----【查询条件化简】【外连接消除】【子查询简介、分类、注意事项】【子查询优化】【子查询的执行方式】
第14章 查询优化前导知识what查询优化就是MySQl会将程序员编写的一些比较耗费性能的语句进行查询重写条件化简移除不必要的括号常量传递某个表达式是某个列和某个常量的等值匹配,会直接用常量替换列名移除没用的条件比如永远为true或false表达式计算表达式只包含常量的话,值会被计算出来如果某个列在函数中或者以运算形式出现,优化器不会进行化简having和where子句的合并查询语句中没有sum、max这样的聚集函数以及group子句的话,优化器会将havin
2021-11-26 22:29:23 627 1
原创 《MySQL是怎样运行的》【第13章 InnoDB怎样收集统计数据】笔记----【表/索引的统计数据】【InnoDB统计数据的存储】
第13章 InnoDB怎样收集统计数据前导知识表的统计数据show table status;索引的统计数据show index;统计数据的存储永久性存储存储于磁盘上,服务器重启后数据仍然存在实际存储在磁盘内的两个表中innodb_index_statsinnodb_table_stats非永久性存储存储于内存中,服务器重启时,重新收集统计数据...
2021-11-26 22:27:19 506
原创 《MySQL是怎样运行的》【第12章 成本优化】笔记----【单表查询的成本】【执行计划的确定】【连接查询的成本】
第12章 成本优化成本是what一条查询语句在MySQL中的执行成本由 I/O成本、CPU成本 组成I/O成本:InnoDB、MyISAM存储引擎将数据和索引存储在磁盘,当查询记录时,需要将数据记载到内存上。从磁盘加载到内存过程中损耗的时间就是I/O成本CPU成本:读取记录、检测记录是否符合搜索条件、对结果排序等操作耗费的时间单表查询的成本查询之前MySQL的优化器会找出所有可以用来执行该语句的方案,找到成本最低的方案作为执行计划执行计划的确定1、根据搜索条件,找到所
2021-11-24 21:08:22 514
原创 【Effective C++ 条款41-45 笔记】【template隐式接口和编译期多态】【typename的双重意义】【处理模板化基类中的名称】【使用成员函数模板接受所有兼容类型】
条款41:template的隐式接口和编译期多态对于class来说是:显式接口、运行期多态显式接口:由函数签名式(函数名称、参数类型、返回值类型)组成运行期多态:根据运行期对象的实际类型决定调用哪个函数对于template来说就是:隐式接口、编译期多态隐式接口:不基于函数签名式,而是由有效表达式组成编译期多态:以不同的template参数具现化函数模板会导致调用不一样的函数编译期多态与运行期多态的区别,类似于:”哪一个重载函数该被调用(发生在编译期)“和”哪一个virtual函
2021-11-24 15:42:42 665
原创 《MySQL是怎样运行的》【第11章 表连接的原理】笔记----【数据库表连接过程】【SQL内/外连接】【where和on的区别】【使用索引加快连接速度】【基于块的嵌套循环连接】
第11章 表连接的原理前导知识连接:将各个表中的记录都取出来进行依次匹配,将匹配后的结果发给客户端笛卡尔积:连接查询的结果中包含一个表的每一条记录与另一个表中每一条记录的组合,这样的查询结果就是笛卡尔积比如表a有5条记录;表b有6条记录;a和b的笛卡尔积就是30连接过程1、确定第一个需要查询的表,此表为驱动表2、从驱动表中取每一条符合搜索条件的记录,到接下来的表中查找匹配的记录;驱动表之后的那个表就叫被驱动表只需要访问驱动表一次,可能会多次访问被驱动表每获得一条满足条件的驱动表记录,马上
2021-11-23 22:11:34 395
原创 【Effective C++ 条款34-40 笔记】【区分接口继承和实现继承】【绝不重新定义继承而来的non-virtual函数和继承而来的缺省参数值】【明智使用private继承和多重继承】】
条款34:区分接口继承和实现继承public继承可分为两种:函数接口继承函数实现继承首先要明白纯虚函数:带有纯虚函数的类是抽象类,抽象类不能实例化对象,抽象类的子类必须重写该纯虚函数才能实例化对象,否则子类也将是个抽象类成员函数的接口总会被子类继承。声明一个纯虚函数是为了让子类只继承函数接口声明一个普通的虚函数,是为了让子类继承该函数的接口和缺省实现声明一个non-virtual函数,是为了让子类继承这一函数接口以及父类对该函数的实现条款36:绝不重新定义继承而来的non-virt
2021-11-23 16:18:22 236
原创 《MySQL是怎样运行的》【第10章 单表访问方法】笔记
第10章 单表访问方法前导知识单表查询:from子句后只有一个表访问方法:MySQL执行查询语句的方式访问方法的分类constwhat:通过主键或位移耳机索引列来定位一条记录约束:只能在主键列或唯一二级索引列与一个常数进行等值比较时才有效,必须要保证最多只有一条记录符合搜索条件refwhat:通过二级索引列与常数进行等值比较,形成的扫描区间为单点对于普通的二级索引列,使用ref可能获取到多条连续的二级索引记录每获取到一条二级索引记录,会立刻进行回表ref_or_null
2021-11-21 22:11:16 500
原创 【Effective C++ 条款29-33 笔记】【为异常安全而努力】【透彻了解inline】【确定public继承塑造出is-a关系】【避免遮掩继承来的名称】
条款29:为异常安全而努力当异常被抛出时,具有异常安全的函数会:不泄露资源不丢失数据copy and swap(CAS):为打算修改的对象创建一份副本,在副本上进行一系列修改。在修改副本的过程中抛出任何异常,原对象不受影响。当所有的改变都成功后,将修改之后的副本和原对象在一个不抛出异常的操作中置换条款30:透彻了解inlineinline函数能够避免函数调用的开销,还能够让编译器对inline函数进行优化这是因为inline函数的机制是:在编译期以函数本体替换对inline函数的每一个调
2021-11-21 20:50:50 670
原创 【Effective C++ 条款24-28 笔记】【所有参数都需要类型转换,请采用non-member函数】【尽可能延后变量定义式的出现时间】【尽量少做转型动作】...
条款24:若所有参数都需要类型转换,请采用non-member函数比如一个重载乘号运算符的函数,如果operator*是member函数,那么该函数值接收一个形参,作为二元操作符,另一个参数就是对象自己如果operator*是一个non-member函数,那么必须在参数列表中必须写明两个形参比如自定义一个有理数类,在该类中我们重载operator*运算符,使该类的对象能够与普通的int变量进行计算class Rational {public: ... const Rational
2021-11-20 21:19:47 255
原创 Git——《百度技术培训中心》--《Devops-Git》课程的笔记
Git本文是对《百度技术培训中心》–《Devops-Git》课程的笔记网址:《百度技术培训中心》–《Devops-Git》上一张思维导图:安装Linux安装sudo apt-get install git配置Git提交代码者信息:git config --global user.name “此处填写用户名”git config --global user.email “此处填写邮箱”创建本地版本库1、mkdir dirGit(本地版本库名字)2、cd dirGit3、
2021-11-20 20:01:18 780
原创 【Effective C++ 条款20-23 笔记】【以传const引用替换传值】【必须返回对象时,别妄想返回其reference】【将成员变量声明为private】
条款20:以pass-by-reference-to-const替换pass-by-value意思是:参数传递最好用传const引用代替普通的传值为什么呢?传引用可以直接将实参本体传递进函数,而不用调用各种构造函数以及析构函数(完成副本的创建及销毁);注意:效率的提高并不只是减少了一次副本对象的拷贝构造以及析构,副本内可能含有多个同样需要拷贝构造的对象也需要创建并销毁传const引用可以告诉函数,以只读的形式对待实参在形参是父类对象,实参是子类对象的时候,传值的方式会直接将实参进行对象切割,构造
2021-11-19 21:35:26 615
原创 《MySQL是怎样运行的》【第9章 InnoDB的表空间】笔记
第9章 InnoDB的表空间上一张思维导图前导知识系统表空间:对应一个文件系统中一个或多个实际文件独立表空间:对应文件系统中名为“表名.ibd”的文件一个表空间最多可以拥有2^32个页独立表空间区(extent)对16KB的页来说,物理位置上连续的64个页组成一个区,即区的大小默认1MB当表的数据量很大时,为某个索引分配空间不以页为单位,而是以区为单位区的分类FREE:空闲的区FREE_FRAG:有剩余空闲页面的碎片区FULL_FRAG:没有剩余空闲页面的碎片区F
2021-11-19 19:55:14 1073
原创 《MySQL是怎样运行的》【第8章 MySQL的数据目录】读书笔记
第8章 MySQL的数据目录上一张思维导图前导知识1、存储引擎InnoDB、MyISAM将数据存储在磁盘2、操作系统通过文件系统管理磁盘因此,存储引擎是将数据存储在文件系统上MySQL目录安装目录:存储控制客户端和服务端的程序文件数据目录:服务器启动时在该目录下加载数据,之后在运行过程中将产生的数据存在该目录下的文件中数据目录对应系统变量datadirmysql查看数据目录:show variables like 'datadir;数据库在文件系统中的表示每个数据库对应数据
2021-11-18 21:45:40 597
原创 【Effective C++ 条款13-17 笔记】【以对象管理资源】【在资源管理类中小心copying行为】【在资源管理类中提供对原始资源的访问】【成对使用mew和delete时要采取相同形式】..
条款13:以对象管理资源动态分配对象时,对象存储在heap上,若不及时或者忘了delete对象指针,会造成内存泄露即便最后没有忘记delete对象指针,在函数运行到delete语句之前,可能会遇到以下状况使得delete语句不被执行:new和delete之间有一个过早的returnnew和delete位于某个循环内,该循环由于某个continue、break或者goto过早退出delete语句之前抛出异常,直接跳转到异常处理函数为了防止资源泄露,主要有两点要注意:获得资源后立即放进资源的
2021-11-18 20:36:35 275
原创 【Effective C++ 条款08-12 笔记】【别让异常逃离析构函数】【不在构造和析构过程中调用virtual函数】【令operator=返回一个绑定到*this的引用】...
条款08:别让异常逃离析构函数C++并不禁止析构函数抛出异常,但是不建议这样做有两个异常存在的情况下,程序不是结束执行就是导致不明确的行为如果无法避免析构函数产生异常的可能性,有两种办法:1、若析构函数爬出异常,就调用abort结束程序A::~A() { try {a.func();} catch(...) { //记录调用a.func()过程中出现异常 abort(); }}2、吞下异常,当做什么也没发生过A::~A()
2021-11-17 21:06:24 369
原创 【Effective C++ 条款05-07 笔记】【C++默默编写并调用哪些函数】【禁止编译器自动生成函数】【什么时候基类要带虚析构函数】
条款05:了解C++默默编写并调用哪些函数一个空类,编译器会自动声明:默认构造函数(对于非空类:只在没有自定义任何构造函数的时候,才会由编译器补充)拷贝构造函数拷贝赋值运算符析构函数(非虚函数)注意:当一个class内含有reference/const成员时,编译器不提供拷贝赋值运算符的补充,只能由程序员自己编写这是因为C++不允许改变reference成员的指向,也不允许更改const成员条款06:若不想使用编译器自动生成的函数,就该明确拒绝问题:比如说想要禁止一个类对象的拷贝
2021-11-16 20:36:39 366
原创 《MySQL是怎样运行的》【第5章 InnoDB数据页结构 】 【第6章 B+树索引】笔记
MySQL是怎样运行的上一个思维导图第5章 InnoDB数据页结构数据页结构快览页是什么:InnoDB管理存储空间的基本单位数据页是什么:索引页,就是存放记录的页页大小:16KB页类型:根据存储内容而定,如inode、undo log信息;最关心的是存放记录(数据)的页页与记录:一个页中可存放多条记录,所有的记录存在页的User Record区页中存储的记录被删除的记录并不会马上在页中清除,而是组成一个垃圾链表,置入可重用空间多条记录在一个页中紧密排列,成为一个堆heap_n
2021-11-15 21:44:58 1012
原创 【Effective C++ 条款03 笔记】尽可能使用const
条款03:尽可能使用const一、顶层const和底层const区分一下:int a = 1;const int* pa = a;//底层const,a的值不能变int b = 2;int* const pb = b;//顶层const,pb的值不能变,即不能更改pb的指向注意除了指针这种复合类型,其余基本类型的变量设置const全部为顶层const二、const作用于迭代器声明一个const迭代器与顶层指针类似:const vector<int>::iterator it
2021-11-12 20:37:47 546
原创 【Effective C++ 条款02 笔记】尽量以const,enum,inline替换#define
条款02:尽量以const,enum,inline替换#define部分来源:https://blog.csdn.net/weixin_37992828/article/details/81117036关于const在使用宏定义的时候,比如#define pi 3.14159宏pi根本没有进入记号表,当使用这个宏但是编译错误时,只会提示是3.14159出现了错误。如果这一行宏定义出现在不是程序员自己写的头文件时,也就查不到这个3.14159到底是出现在哪里了。因此,提倡使用常量来替换宏定义
2021-11-08 20:25:10 150
原创 【面经专栏】测试用例的设计方法
测试用例常见的设计方法有:等价类划分法、边界值分析法、错误推测法、判定表法、正交实验法。一、等价类划分法顾名思义,顾名思义,等价类划分,就是将测试的范围划分成几个互不相交的子集,他们的并集是全集,从每个子集选出若干个有代表性的值作为测试用例。 例如,我们要测试一个用户名是否合法,用户名的定义为:8位数字组成的字符。 我们可以先划分子集:空用户名,1-7位数字,8位数字,9位或以上数字,非数字。 然后从每个子集选出若干个有代表性的值: 空用户名:“” (无效等价类实例,指对于软件规格说明而
2021-10-18 14:03:16 537
原创 【面经专栏】自己的整理的测试面经
单元测试、集成测试、系统测试、验收测试、回归测试(alpha、beta)所有测试环节中,最重要的是哪一步集成测试和系统测试的区别,以及他们的应用场景测试开发需要什么知识黑盒、白盒测试方法手动测试、自动化测试的优缺点软件测试的核心竞争力测试和开发怎样结合(V模型、W模型)单元测试的可行性自动化测试的意义,需要做什么测试的相关流程怎样写测试用例测试项目的具体工作怎样评测bug(优先级、严重等级)测试用例的常见边界设计测试用例的方法app性能测试的指标app测试的工具b.
2021-10-18 14:02:07 178
原创 【面试专栏】自己整理的WebServer项目问题
1.怎样应对服务器的大流量、高并发客户端:尽量减少请求数量:依靠客户端自身的缓存或处理能力尽量减少对服务端资源的不必要耗费:重复使用某些资源,如连接池服务端:增加资源供给:更大的网络带宽,使用更高配置的服务器请求分流:使用集群,分布式的系统架构应用优化:使用更高效的编程语言,优化处理业务逻辑的算法2.线程池与多线程的设计思路设计一个任务队列,作为临界资源初始化n个线程,开始运行,对任务队列加锁取拿取任务执行当任务队列为空时,所有子线程(工作线程)阻塞(pthread_
2021-10-18 13:59:57 6897
原创 【面经专栏】自己整理的数据结构与算法面经
1、排序算法的稳定性堆排序、快速排序是不稳定的排序算法,而冒泡排序、插入排序、归并排序是稳定的排序算法。 【总结排序算法实现与稳定性】https://www.cnblogs.com/lqminn/p/3642027.html 假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原 序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。2、红黑树和AVL树的区别AVL树是带有平衡条
2021-10-18 13:58:39 966
原创 【面经专栏】自己的整理的数据库面经
1、关系型数据库和非关系型数据库1.mysql和redis的数据库类型mysql是关系型数据库,主要用于存放持久化数据,将数据存储在硬盘中,读取速度较慢。redis是NOSQL,即非关系型数据库,也是缓存数据库,即将数据存储在缓存中,缓存的读取速度快,能够大大的提高运行效率,但是保存时间有限2.mysql的运行机制mysql作为持久化存储的关系型数据库,相对薄弱的地方在于每次请求访问数据库时,都存在着I/O操作,如果反复频繁的访问数据库。第一:会在反复链接数据库上花费大量时间,从而导致运行效率过慢
2021-10-18 13:57:00 1621
原创 【面经专栏】自己整理的操作系统面经
1、需要线程频繁加锁解锁的场景,怎么优化CPU性能临界区处理很快,也许用 spin lock(自旋锁) 或者 lock-free 算法,临界区处理很慢, mutex 更合适lock-free:是一种编程思想,指的是使用多线程的条件下,尽量少使用锁以降低线程之间互相阻塞的机会;在一系列访问 Lock-Free 操作的线程中,如果某一个线程被挂起,那么其绝对不会阻止其他线程继续运行不要使用自旋锁,因为线程得不到锁的时候会一直在循环等待,不会进入休眠使用互斥锁,结合条件变量,引入线程的等待与通知机
2021-10-18 13:55:37 2136
原创 【面经专栏】独家整理【计算机网络面经】
1、地址总线、数据总线、控制总线的作用数据总线是CPU与内存或其他器件之间的数据传送的通道。数据总线的宽度决定了CPU和外界的数据传送速度。每条传输线一次只能传输1位二进制数据。eg: 8根数据线一次可传送一个8位二进制数据(即一个字节)。数据总线是数据线数量之和。地址总线CPU是通过地址总线来指定存储单元的。地址总线决定了cpu所能访问的最大内存空间的大小。eg: 10根地址线能访问的最大的内存为1024位二进制数据(1024个内存单元)(1B)地址总线是地址线数量之和。控制总
2021-10-18 13:53:09 1597
原创 【面经专栏】独家整理【C++】面经
C++1、动态库的查找顺序ELF文件的DT_RPATH段环境变量LD_LIBRARY_PATH库高速缓存/etc/ld.so.cache文件列表默认路径/lib /usr/lib2、虚继承,多重继承中派生类对象内有谁3、RTTI,typeid是怎么知道指向对象的类型的 typeid函数的主要作用就是让用户知道当前的变量是什么类型的,比如使用typeid(a).name()就能知道变量a是什么类型的。typeid()函数的返回 类型为type_info类型的引用 运行时的多态是通
2021-10-18 13:50:40 1934
原创 【面经专栏】成建制面经大杂烩【C++面经】【操作系统面经】【计算机网络面经】【数据库MySQL/Redis面经】
2021年秋季招聘接近尾声,也是时候整理一些自己的面试问题总结了。在7月中旬到9月末开始,陆续整理了以下C++后端岗位的面试问题。关于来源:标注【牛客】的部分题目来自牛客上的面试题目,安利一下牛客的秋招集训营,很全面很高效标注【拓跋阿秀】的问题来自同名公众号,这是阿秀大佬整理的问题标注【Guide】的问题来自javaguide,这也是大佬整理的问题注意:本博客仅涉及面试问题的题目,对于题目的具体解答请去上面提到的源头查看,也可自行百度解决【牛客】C++语言基础1.1.1 C++语言的
2021-10-18 13:42:35 1259
原创 操作系统各种算法汇总【页面置换/缺页中断算法】【进程调度算法】【动态分区分配算法】【磁盘调度算法】
1 - 页面置换算法页面置换又叫缺页中断算法,是为了解决:在地址映射过程中,若在页面中发现所要访问的页面不在内存中,则产生缺页中断。当发生缺页中断时,如果操作系统内存中没有空闲页面,则操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。而用来选择淘汰哪一页的规则叫做页面置换算法最佳置换法(OPT)先进先出置换法(FIFO)最近最久未使用置换法(LRU)时钟置换(CLOCK)下面分别介绍最佳置换(OPT)每次选择淘汰的页面时以后永不使用的页面,或者是在最长时间内
2021-07-15 11:26:25 1321
原创 WebServer代码解读(5)【处理HTTP请求】【响应POST/GET请求】
文章目录1 - 处理HTTP请求1-1 处理POST请求1-2 处理GET请求1 - 处理HTTP请求这里只处理两种简单的HTTP请求,POST和GET首先来了解一下GET与POSTGET是想获取server数据,将请求的数据添加到URL中,以?分割URL和传输数据,参数值之间以&相连,因此GET不安全。GET产生一个TCP数据包,浏览器将HTTP header和data一起发送给server,server响应状态码200(请求正常处理完毕)(返回数据)POST是想修改server数据,
2021-06-06 21:39:10 1625 3
原创 WebServer代码解读(4)【解析HTTP请求】【解析请求行/请求头】【URI基础知识】
文章目录1 - 解析HTTP请求1-1 URI基础知识1-2 HTTP请求消息1-3 解析请求行1-4 解析请求头2 - 下一步工作1 - 解析HTTP请求1-1 URI基础知识首先了解一下什么是URI:统一资源标志符URI就是在某一规则下能把一个资源独一无二地标识出来,可以理解为一个用于标识某一互联网资源名称的字符串。常见的URL(就是浏览器中输入的网址,比如http://www.163.com就是一个URL)就是URI的一个子集,URI能够定位网络上的各种资源,包含HTML文档、图像、视频、程
2021-06-01 16:16:40 1647
原创 WebServer代码解读(3)【最小堆定时器与队列】
文章目录1 - 处理事件1-1 接收新连接1-2 最小堆定时器1-4 将request加入线程池1-5 处理request1 - 处理事件因为epoll_wait函数已经返回了需要处理的事件数目events_num,并且已经将events_num个数的事件排到了数组的最前面,因此使用一个for循环取出前events_num个事件的data处理事件的逻辑为:遍历events_num若当前事件是新连接,接收新连接否则,判断该事件合法以后,将该事件的请求request加入线程池(使用工作线程处理该
2021-05-27 10:23:17 1079 1
原创 WebServer代码解读(2)【初始化server socket】【设置epoll事件】【注册描述符】【封装epoll_wait】
文章目录1 - server socketsocket创建、绑定、监听关于listen函数设置监听socket为非阻塞2 - 设置epoll事件epoll事件类型水平触发与边沿触发3 - 注册新描述符4 - 等待事件发生1 - server socket首先要创建server端的socket(socket函数),绑定端口(bind函数),开始监听(listen函数)绑定端口时注意,0-1023为知名端口号范围,能够bind的端口限制在1024-65535之间还要注意绑定的端口如果被占用(Addre
2021-05-21 20:49:49 453
原创 堆排序【二叉堆简介】【二叉堆插入/删除堆顶/构造】【堆排序】【最大堆/最小堆】
文章目录0 - 前言1 - 二叉堆简介1-1 向二叉堆中插入节点(最小堆)1-2 删除堆顶节点(最小堆)1-3 将完全二叉树转化为二叉堆1-4 代码实现2 - 堆排序0 - 前言本文是对下面两篇博文做的笔记参考:【算法与数据结构】二叉堆是什么鬼?【算法与数据结构】堆排序是什么鬼?1 - 二叉堆简介二叉堆是一种完全二叉树,分为最大堆和最小堆最大堆:任意父节点的值 ≥ 左右子节点的值;堆顶(即二叉树的根节点)是堆中最大元素最小堆:任意父节点的值 ≤ 左右子节点的值;堆顶是堆中最小元素
2021-05-21 11:16:24 293
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人