08 2022 档案
摘要:如何实现堆排序 使用 C++ STL派生容器 priority_queue 优先队列 自己写一个小根堆 两种方式各有好处,STL容器的方法用起来方便,而自己写的灵活性更大,可以自定义实现更多操作。 下面介绍一下 priority_queue 在做题的常用方法,以及手撕堆的实现。 优先队列堆排序 优先
阅读全文
摘要:在4G主存机器申请8G内存会发生什么 在 32 位操作系统,因为进程最大只能申请 3 GB 大小的虚拟内存,所以直接申请 8G 内存,会申请失败。 在 64 位操作系统,因为进程最大可以申请 128 TB 大小的虚拟内存,即使物理内存只有 4GB,申请 8G 内存也是没问题,因为申请的内存是虚拟内存
阅读全文
摘要:内存回收的方式 前文提到malloc的内存分配方式,malloc申请的是虚拟内存,只有在程序去访问时,才会触发缺页异常进入内核态,在缺页中断函数中建立物理内存映射。 如果物理内存充足,则直接建立页框与页的映射。当物理内存不足时,内核会进行物理内存回收,内存回收的方式主要有: 后台内存回收(kswap
阅读全文
摘要:内核的内存分区 32位机中的虚拟内存大小为4GB,其中0~3GB用于用户空间,3~4GB用于内核空间。 内核的内存空间只有1G,这一部分内存在进程中共享,与用户空间隔离,用户空间不能访问。 内核空间在虚拟内存上分为三个区间:从低到高分别是: ZONE_DMA(16M) ZONE_NORMAL(16~
阅读全文
摘要:malloc分配内存的方式 学C语言时我们知道,malloc是动态内存分配,也就是在程序运行执行到malloc函数时才会从堆上分配指定的内存大小。 首先要知道Linux的把内存分为6个区:栈区、文件映射区、堆区、BSS区、数据区、代码区。 分区只在虚拟内存上进行逻辑划分,物理内存上不存在逻辑分区的概
阅读全文
摘要:分段与分页的区别 分段: 分页: 分段和分页的工作方式相似,都是非连续存储。 分段的逻辑地址=段号+段内偏移。段表存放段描述符。段描述符=段基址+段界限。物理地址=段基址+段内偏移。 分页的虚拟地址=页号+页内偏移。页表存放页面映射。页面映射=虚拟页号+物理页号。物理地址=物理页号+页内偏移。 但是
阅读全文
摘要:虚拟内存 为什么要有虚拟内存? 让每个进程都有独立的内存空间,每个进程都有自己的私有页表,提供一个可以执行多进程的环境。 利用程序运行局部性原理,允许进程的内存空间超过物理内存大小。 页表中维护着页的权限属性,使内存访问更安全。 假如没有虚拟内存,则会有进程空间不隔离的问题,比如进程A会改写进程B的
阅读全文
摘要:# 字符串匹配——KMP算法 1. 算法原理 在暴力匹配过程中,当遇到匹配失败的字符时,暴力法做法是将模式串后移一位,从头开始匹配,直到成功匹配下一位字符。 KMP算法的核心思想就是:充分利用模式串自身的信息,在每次匹配失败之后不需要重复匹配之前已经成功匹配的字符,快速定位到下一个需要匹配的字符,从
阅读全文
摘要:二分查找 二分查找分为整数二分和小数二分,其中整数二分涉及的边界问题比较多,理解起来相对复杂。 # 整数二分 如果可以找到一个性质,可以把区间一分为二,一半满足性质一半不满足。二分可以找到这个性质的边界,可以是①也可以是②。 这里这个分界点①和②就分两种情况讨论。 # 寻找边界点①——右边界 mid
阅读全文
摘要:1. 归并排序——分治 # 算法原理 归并排序的思想就是分治,先递归分解数组,再合并数组。 将数组分解到最小之后,再往上一层两两合并两个有序的数组,最终递归返回的就是一个排好序的数组。 递归分解的时间复杂度是O(logn),合并数组的时间复杂度是O(n),因此归并排序的时间复杂度就是O(nlogn)
阅读全文
摘要:1. 快速排序——分治 # 算法原理: 在给定序列找到一个点x使得x左边区间数都小于x,右边区间数都大于x # 步骤: 确定分界点 随机,可以是第一个数 调整区间 使左边都小于分界点,右边都大于分界点 递归处理左右两段 递归停止的条件if(l >= r) return;即区间里没有数或只有1个数就直
阅读全文

浙公网安备 33010602011771号