- 博客(68)
- 收藏
- 关注
原创 程序员的自我修养-略读
②读取可执行文件头,创建虚拟地址空间与可执行文件的关系,具体的,运行时缺页,然后通过页中断,将页表中对应磁盘中可执行文件的部分装载进内存,由linux内存管理实现,也是传统的装载。 共享库的版本,xxxx.X.Y.Z: X表示主版本,不同主板本的库不兼容,Y表示次版本,添加新的API(接口),Z表示发布版本号(修bug,性能改进) **段地址对齐,**页的单位大小为4KB,将segment邻接区域的一个页,通过两次映射到虚拟地址的两个页,实现内存空间的充分利用。
2025-02-22 18:04:44
745
原创 mysql_复合查询
其他四大jion,分别对笛卡尔积取交集,并集,以及交集并上chart1或者chart2。 按cilumnZ分组,美足最大sal和sal组合和的表,并且 columnX=num1. 如果子查询是一行的话,条件匹配可以为 =; chart1所有行匹配chart2所有行,然后显示columnY。 columnX在子查询的表中存在,查询所有的columnY。 part2是打印的表,信息从这里获取,使用笛卡尔积时, part1是显示部分,打印所需的信息,依旧是一个表,
2025-02-22 11:11:45
304
原创 Hash表,STL-unordered_map和unordered_set
下面是模拟的底层hash表:使用的是开放定址法。一、unordered_map和unordered_set。
2025-02-18 18:47:22
251
原创 MySQL服务端启动问题
上图命令运行后出现:Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details.使用mysql_update命令,更新mysqld的各种配置,但是mysqld没有启动,无法运行。我是通过查看mysql.log日志给Al,它让我使用mysql_update命令。
2025-02-18 18:46:44
1002
原创 算法笔记—前缀和(动态规划)
优化:前缀和+同余定理:首先,加以i结尾的子数组和为y,sum是i的前缀和,然后y%k==0表示子数组的和可以被整除。所以(sum-x)%k==0 => 同余定理: sum%k==x%k,其中x可以是i之前所有元素的前缀和,我们用hash统计好i之前所有元素的前缀和,就可以得出以i结尾的子数组和为k的个数。细节:这里的sum和x可能为负数,所以%k取余可能是负数,所以用 sum%k==x%k,无法正确判断出一些特殊情况,例如sum=-3,x=2;同余定理:(a-b)%k==c……
2024-12-20 22:54:47
269
原创 linux-多线程
在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”一切进程至少都有一个执行线程 线程在进程内部运行,本质是在进程地址空间内运行在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流ps:类Unix系统(linux和macos),系统并没有针对线程专门设计线程控制块,而windows针对线程设计了线程控制块。
2024-12-20 18:01:07
1177
原创 C++特殊类设计,
比如在某个服务器程序中,该服务器的配置 信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再 通过这个单例对象获取这些配置信息,这种方式简化了在复杂环境下的配置管理。如果单例对象构造十分耗时或者占用很多资源,比如加载插件啊, 初始化网络连接啊,读取 文件啊等等,而有可能该对象程序运行时不会用到,那么也要在程序一开始就进行初始化, 就会导致程序启动时非常的缓慢。派生类的继承会调用基类的构造函数,c++98将基类的构造函数私有化,派生类中调不到基类的构造函数。
2024-09-05 22:24:32
709
原创 C++的四种规范的类型转换
dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换) 向上转型:子类对象指针/引用->父类指针/引用(不需要转换,赋值兼容规则) 向下转型:父类对象指针/引用->子类指针/引用(用dynamic_cast转型是安全的)static_cast:用于非多态类型的转换(静态转换),编译器隐式执行的任何类型转换都可用 static_cast,但它不能用于两个不相关和const与非const的类型进行转换。1. dynamic_cast只能用于父类含有虚函数的类。
2024-09-05 22:24:16
546
原创 进程通信-ipc
一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到 内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另 一个进程的所有陷入和异常,并能够及时知道它的状态改变。通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止 时要通知父进程)。我们把从一个进程连接到另一个进程的一个数据流称为一个“管道。管道是Unix中最古老的进程间通信的形式。
2024-07-27 17:37:41
986
原创 操作系统信号_linux
1.忽略2.执行该信号的默认动作,默认动作也可以什么都不做3.提供一个信号处理函数,要求内核在处理该信号时切换到用户态执行这个处理函数,这种方式称为捕捉 (Catch)一个信号.处理函数也可以什么都不做。
2024-07-27 17:33:49
790
原创 贪心算法—
贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。这种算法并不总是能找到全局最优解,但在某些问题上能提供足够好的解决方案。
2024-06-22 18:23:43
975
原创 文件管理—linux(基础IO)
openlinux 手册查看命令:man openint main()return 1;\n";while(1){//类比writeif(s > 0){}else{break;close(fd);return 0;pathname: 要打开或创建的目标文件flags: 打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行“或”运算,构成flags。参数:O_RDONLY: 只读打开O_WRONLY: 只写打开O_RDWR : 读,写打开。
2024-06-22 18:16:06
1150
原创 RAII与智能指针-c++
什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内 存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对 该段内存的控制,因而造成了内存的浪费。内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现 内存泄漏会导致响应越来越慢,最终卡死// 1.内存申请了忘记释放// 2.异常安全问题Func();// 这里Func函数抛异常导致 delete[] p3未执行,p3没被释放.
2024-06-10 23:08:11
756
原创 背包问题—动态规划
与找521 零钱兑换的方式的区别,这个是排列,顺序不同,也统计次数。01背包问题:没有物品(元素)只能选择1次。完全背包,物品(元素)个数有无限个。
2024-06-10 23:07:46
216
原创 进程控制—linux
shell建立一个新的进程,然后在那个进程中运行ls程序并等待那个进程结束。用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数 以执行另一个程序。而且它们都运行到相同的地方。然后shell读取新的一行输入,建立一个新的进程,在这个进程中运行程序 并等待这个进程结束。通常,父子代码共享,父子再不写入时,数据也是共享的,当任意一方试图写入,便以写时拷贝的方式各自一份副 本。在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。
2024-06-08 18:34:39
1145
原创 进程——linux
计算机管理硬件1. 描述起来,用struct结构体2. 组织起来,用链表或其他高效的数据结构系统调用和库函数概念在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统 调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。至此,值得关注的进程状态全部讲解完成,下面来认识另一种进程。
2024-06-01 21:51:20
1119
原创 算法-二分查找
具体:定义区间左右指针,中间结点的数值与目标值比较结果,不断减少一半的区间长度,其去target所在区间里搜索,如果left>right跳出循环。二分查找:在数组有序的条件下,通过不断选取中间结点,根据中间结点的数值与目标值比较结果,将。右边界模板,通过二段性,分成两段,target位于左段(左区间)的最右端点。左边界模板,通过二段性,分成两段,target位于右段(右区间)的左端点。
2024-04-22 15:13:56
582
1
原创 算法—hash表
熟悉hash映射,用key判断是否对象存在或者存在个数,在其他问题种常用来记录key(键值)是否存在(或者存在个数),用来if判断。
2024-04-17 12:02:25
346
原创 linux权限
目录的可执行权限是表示你可否在目录下执行命令。如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd 进入目,即使目录仍然有-r 读权限(这 个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)而如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录。但由于没有目录的读权限所以在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档。
2024-04-16 22:59:42
1239
原创 算法—链表操作
掌握数据结构链表的头插和尾插,删除,查找的操作,然后就可以根据题目要求实现其操作组合。对于链表来说,画图更好理解题解中的具体步骤,否则难以理解代码实际对数据结构的操作。
2024-04-16 10:14:47
286
原创 算法—分治
具体实现:多数采用递归操作分解,然后递归操作,需要注意的是函数头,函数体,以及递归出口,函数头:由问题所需变量指定,递归出口由问题最小规模返回决定,函数体看问题具体的需要的信息决定。分治-快速排序:下面这三题:都是快排,其中第一题快排,第二题,在快排的基础上,进行剪枝,避免无用的排序,第三题同理,也是避免无用排序。O(Nlog2k);:指的是当主问题可以被分解为一个相同次级问题加相同基本问题时,采用这种思想,基本问题指问题规模最小时的情况,次级问题是指主问题的n级降低n-1级的问题。
2024-04-13 07:53:16
339
原创 c++11的重要特性3
同时还用到了C++11的另外一个特性——初始化列 表,通过初始化列表来初始化一个变长数组, {(printarg(args), 0)...}将会展开成((printarg(arg1),0), (printarg(arg2),0), (printarg(arg3),0), etc... ),最终会创建一个元素值都为0的数组int arr[sizeof...(Args)]。的, 只能通过展开参数包的方式来获取参数包中的每个参数,这是使用可变模版参数的一个主要特 点,也是最大的难点,即如何展开可变模版参数。
2024-04-06 21:14:15
809
原创 左值与右值,以及与其相关的c++11的重要特性1。
1. 左值引用只能引用左值,不能引用右值。2.但是const左值引用既可引用左值,也可引用右值。int main()// 左值引用只能引用左值,不能引用右值。int a = 10;// ra为a的别名// 编译失败,因为10是右值// const左值引用既可引用左值,也可引用右值。return 0;1. 右值引用只能右值,不能引用左值。2.但是右值引用可以move以后的左值。int main()// 右值引用只能右值,不能引用左值。
2024-04-02 18:07:49
1085
原创 算法-滑动窗口
本题更新结果具体问题具体分析,因为出窗的条件是满足问题目标,所以需要在出窗满足时,提前更新结果,然后观察其他问题,出窗条件为不满足问题目标(通常是大于/超过)。滑动窗口,与双指针类似,也是使用两个指针进行移动遍历数组处理,也可以说时双指针中的一个特殊类型,因为左右指针同向移动,左右指针中间所夹的区域像一个窗口一样移动,所以称为滑动窗口。以第一个例题举例,首先需要两个指针,一个指针入窗口(right),一个指针出窗口(left),以及right遍历的所需条件。第一个例题是在出窗口前时,满足条件,更新结果。
2024-03-30 23:58:03
558
原创 算法—位运算
按位与1后,除最低位外所有位变为0,判断最低位,为1,所有数n的x位为1,反之为0。然后与数n按位或 ,(bit)0与任意或为任意,1与任意或为1,所有将数n的x位置为1。然后与数n按位与,(bit)1与任意与为任意,0与任意与为0,所以将数n的x位置变为0。将(int)1左移x位,在按位取反,变成如下,除了x位外都为1.。原理:-n为:将最右侧的1的左边的数全部取反,然后与数n相与。原理:n-1为将最右侧的1的右边的数全部取反,然后与数n相与。算术右移:仅对于有符号数,对于无符号数为逻辑右移。
2024-03-23 16:03:55
761
原创 红黑树(STL-ordered_map)
结论2:有n个内部结点的红黑树的高度为h=2^(h/2)-1-->log2(n+1)iterator++:iterator++的所指结点,为其右子树的最大值(最左结点),无右子树时,为某一祖先,即从下向上遍历,第一个祖先的左孩子为该iterator所指结点的祖先。类似AVL树,复用旋转函数,但是少了平衡因子变化。
2024-03-20 17:26:04
1020
原创 位图与布隆过滤器
第二步:将对应的小文件(A1和B1),即hash分割时hash函数相同的小文件,一起放进set中,过滤掉重复和不相同的元素,每次处理完将set中的元素存入对应的文件,依次对A2,B2~A200,B200进行相同处理。我们每次加入一个元素后,多个hash函数对应的各自的多个位都+1,每次删除一个元素后,同理减一。第一步,同上,对两个文件各自进行hash分割为200个小文件,分别为A1~A200,以及B~B200,A1和B1采样相同的hash函数,那么两个大文件的同一个query,必然在哈希函数相同小文件中。
2024-03-20 17:24:56
655
原创 STL-map和set
set文档翻译:1、set是按照一定次序存储元素2、在set中,value与key相同,即是唯一的,key不可修改,但是可以插入或者删除3、在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序4. set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对 子集进行直接迭代。
2024-03-05 22:49:59
1067
原创 平衡搜索二叉树—AVL树
为了避免搜索二叉树的高度增长过快,降低二叉树的性能,规定在插入和删除二叉树的结点的时候,任何结点左右子树的高度差绝对值不超过1,这样的二叉树被称为平衡二叉树(balanced Binary Tree),简称平衡树。在搜索二叉树BST的基础上增加以上性质,就称为AVL树。
2024-03-05 22:49:19
402
原创 二叉搜索树
情况4:在它的右子树中寻找中序下的第一个结点(关键字最小),用它的值填补到被删除节点 中,再来处理该结点的删除问题--替换法删,或者在左子树中寻找中序下的最后一个结点,交换此结点与删除结点的值,将其转换为对左子树最右结点的删除(情况1或者2).对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二 叉搜索树的深度的函数,即结点越深,则比较次数越多。情况3:删除该结点且使被删除节点的双亲结点指向被删除结点的右孩子结点--直接删除。删除和插入有递归和非递归两个版本。
2024-02-17 22:46:24
843
原创 java入门、环境配置及其特点介绍
区别是:解释性语言的原代码经过编译后,所形成的代码(java是二进制字节码),不能被计算机直接使用,需要通过解释器来执行。不同的操作系统需要不同的jvm虚拟机器来运行同一个代码(跨平台),所以需要下载不同操作系统的jdk。解释性语言:javascript,PHP,java 编译性语言:c/c++1、组成部分:JDK=java开发工具+JVM(java虚拟机)+java的核心类库[类]在.java文件所在目录下输入cmd,打开命令行,在此目录下使用命令行。1、java的运行机制为。
2024-02-04 22:14:13
450
原创 数据结构—堆:STL-priority_queue
1. 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。2. 此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元 素)。3. 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。4. 底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。empty():检测容器是否为空。
2024-01-29 23:52:02
433
原创 c++多态
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了 Person。Person对象买票全价,Student对象买票半价。那么在继承中要构成多态还有两个条件:1. 必须通过基类的指针或者引用调用虚函数2. 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。
2024-01-28 22:02:53
876
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人