自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原创 全排序

全排列就是从第一个数字起每个数分别与它后面的数字交换。void Perm(int list[] , int k ,int m) { //list 数组存放排列的数,K表示层 代表第几个数,m表示数组的长度 if(k==m) { //K==m 表示到达最后一个数,不能再交换,最终的排列的数需要输出; for(int i=0 ;i<=m ;i++) cout<<list[i]; cout<<endl; } else{ for(i.

2020-05-12 21:02:46 59

原创 进程间通信IPC

进程间通信的目的是实现进程间数据的共享。为什么进程空间是完全独立的? 防止你去害别人也防止别人害你。如何实现?使用虚拟地址空间原理:尽管进程空间是各自独立,但它们共享OS,所以OS作为所有进程共享的第三方,会提供相关机制,来实现进程间数据的转发,达到数据共享的目的。方式:1.信号2.管道 无名管道和有名管道管道其实就是内核自己所在的物理内存空间中开辟的一...

2020-04-20 17:46:58 58

原创 动态规划--最长递增子序列

已知一个序列 {S1, S2,...,Sn} ,取出若干数组成新的序列 {Si1, Si2,..., Sim},其中 i1、i2 ... im 保持递增,即新序列中各个数仍然保持原数列中的先后顺序,称新序列为原序列的一个 子序列 。 如果在子序列中,当下标 ix > iy 时,Six > Siy,称子序列为原序列的一个 递增子序列 。定义一个数组 dp 存...

2020-04-10 19:46:12 62

原创 数列的逆序对

一、暴力遍历法最从前向后依次统计每个数字与它后面的数字是否能组成逆序数对。用到了双循环,时间复杂度为O(N^2)。for (i = 0; i < len; i++){ for (j = i + 1; j < len; j++){ if (a[i] > a[j]) nCount++; }}二、归并排序法比如合并数列(1,3,5...

2020-04-03 11:31:32 57

原创 树中两个节点的最低公共祖先

1.二叉查找树 对于二叉搜索树,公共祖先的值一定大于等于较小的节点,小于等于较大的节点。换言之,在遍历树的时候,如果当前结点大于两个节点,则结果在当前结点的左子树里,如果当前结点小于两个节点,则结果在当前节点的右子树里。 public TreeNode lowes...

2020-04-01 23:40:37 47

原创 HTTP协议

HTTP 请求报文HTTP方法 Get与Post区别HTTP状态码1XX 信息 100 Continue :表明到目前为止都很正常,客户端可以继续发送请求或者忽略这个响应。 2XX 成功 200 OK 204 No Content :请求已经成功处理,但是返回的响应报文不包含实体的主体部分。一般在只需要从客户端往服务器发送信息,而不...

2020-03-17 22:25:43 54

原创 LeetCode中BFS总结

广度优先搜索的搜索过程有像一层一层地进行遍历,每层遍历都以上一层遍历的结果作为起点,遍历一个长度。实现 BFS 时需要考虑以下问题: 队列:用来存储每一轮遍历的节点; 标记:对于遍历过的节点,应该将它标记,防止重复遍历。 只能用来求解无权图的最短路径问题。 典型例题就是:计算在网格中从原点到特定点的最短路径长度 。leetcode102. Bin...

2020-03-15 23:20:47 110

原创 数据库--事务实现原理

事务特性:ACID事务想要做到什么效果?按我理解,无非是要做到可靠性以及并发处理。可靠性:数据库要保证当insert或update操作时抛异常或者数据库crash的时候需要保障数据的操作前后的一致,想要做到这个,我需要知道我修改之前和修改之后的状态,所以就有了undo log和redo log。并发处理:也就是说当多个并发请求过来,并且其中有一个请求是对数据修改操作的时候会有影响,...

2020-03-15 23:20:36 94

原创 数据库--死锁产生原因及解决方法

数据库与操作系统一样,是一个多用户使用的共享资源。当多个用户并发地存取数据时,就会产生多个事务同时存取统一数据的情况。如果对并发操作没有相应的控制就可能会导致读取和存储不正确的数据,破坏了数据库的一致性。 加锁(读锁和写锁)是一种控制方法,但当两个事务要一组有冲突的锁,而不能将事务继续下去的话,就会出现死锁。死锁1:用户A访问表A(锁住了表A),然后又访问表B;用户B访问表B,然...

2020-03-15 23:20:17 119

原创 数据库--索引

索引是在存储引擎层实现的,而不是在服务器层实现的,所以不同存储引擎具有不同的索引类型和实现。索引能够轻易将查询性能提升几个数量级。对于非常小的表、大部分情况下简单的全表扫描比建立索引更高效。对于中到大型的表,索引就非常有效。但是对于特大型的表,建立和使用索引的代价将会随之增长。这种情况下,需要用到一种技术可以直接区分出需要查询的一组数据,而不是一条记录一条记录地匹配,例如可以使用分区技术。...

2020-03-15 23:20:03 94

原创 数据库--乐观锁与悲观锁

乐观锁和悲观锁是什么?乐观锁 总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但在更新的时候会判断一下数据有没有被别人更改过。可以使用版本号机制和CAS实现。乐观锁用于多读操作的场景,冲突发生很少。 可以提高吞吐量。 比如数据库的write_condition机制 也是一种乐观锁。Java中的 java.util.concurrent....

2020-03-15 23:19:42 34

转载 Java内存溢出和内存泄露

一、为什么要了解内存泄露和内存溢出?1、内存泄露一般是代码设计存在缺陷导致的,通过了解内存泄露的场景,可以避免不必要的内存溢出和提高自己的代码编写水平;2、通过了解内存溢出的几种常见情况,可以在出现内存溢出的时候快速的定位问题的位置,缩短解决故障的时间。二、基本概念内存泄露:指程序中动态分配内存给一些临时对象,但是对象不会被GC所回收,它始终占用内存。即被分配的对象可达但已无...

2020-03-15 23:19:20 132

原创 java泛型类

泛型:把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型。为什么需要泛型?我们知道使用Object可以来表示任意类型,但它向下转型有强转的问题,会导致程序不太安全。在集合类中泛型随处可见,那么试想一下,如果集合类中没有泛型会是怎样的呢?因为Map这些集合对元素的类型没有任何限制,我把Dog对象或Cat对象扔进去集合中,集合也不知道元素类型是什么,只知道它们都是各O...

2020-03-07 10:53:13 23

原创 LeetCode中桶排序问题

桶排序

2020-03-04 23:06:53 150

原创 TopK问题之堆排序

堆排序用于求解 TopK Elements 问题,通过维护一个大小为 K 的堆,堆中的元素就是 TopK Elements。当然它也可以用于求解 Kth Element 问题,因为最后出堆的那个元素就是 Kth Element。 快速选择也可以求解 TopK Elements 问题,因为找到 Kth Element 之后,再遍历一次数组,所有小于等于 Kth E...

2020-03-01 20:59:53 32

原创 死锁原因

1.交叉锁会导致程序死锁这个大家都很熟悉了,就是线程A持有R1的锁又想获取R2的锁,线程B持有R2的锁又想获取R1的锁。两个谁也不放弃自己的又想要对方的,就导致死锁了。一般交叉引起的死锁线程都会进入BLOCKED状态,CPU资源占用不高,可以借助jstack或jconsole工具诊断。2.内存不足如两个线程A和B执行某个任务,A已获取10MB内存,B已获取20MB内存,它们执行都需...

2020-03-01 20:23:36 44

原创 ARP地址解析协议

主机间发送以太网数据帧是根据48bit的物理地址来确定目的地的。ARP为IP地址到对应的硬件地址之间提供动态映射,说它是动态,是因为这个过程是自动完成的。ARP解析过程:第一步:首先,每个主机都会在自己的ARP缓存区中建一个ARP列表,来表示IP地址和MAC地址之间的对应关系。第二步:源主机要发送数据时,检查ARP列表中是否有对应IP地址的目的主机的MAC地址,若有,则直...

2020-02-29 21:54:49 58

原创 传输层之TCP与UDP

一、TCP与UDP区别: UDP TCP 是否连接 无连接 面向连接(三次握手) 是否可靠 不可靠传输,不使用流量控制和拥塞控制 可靠传输,使用流量控制和拥塞控制 连接对象个数 支持一对一,一对多,多对一和多对多交互通信 (单播、多播、广播) 只能是一对一通信(单播) 传输方式 面向报文...

2020-02-29 17:54:38 44

原创 TCP拥塞控制

一、慢启动和拥塞避免拥塞避免和慢启动需要对每个连接维持两个变量:拥塞窗口cwnd和慢启动门限ssthresh。发送方维持一个拥塞窗口cwnd,拥塞窗口大小取决于网络的拥塞程度,动态地在变化。拥塞避免是发送方使用的流量控制,通告窗口则是接收方进行的流量控制。前者是发送方感受到网络拥塞的估计,后者则与接收方在该连接上的可用缓存大小有关。慢启动算法: 每次传输,拥塞窗口c...

2020-02-29 15:49:04 45

原创 java线程池

在一个应用程序中,需要多次使用线程,也就是需要多次创建并销毁线程。而创建并销毁线程的过程势必会消耗内存。所以便于管理线程,线程池就诞生啦。ThreadPoolExecutorThreadPoolExecutor的构造函数:public ThreadPoolExecutor(int corePoolSize, ...

2020-02-28 21:01:23 31

转载 操作系统(二)---进程调度算法

一、先来先服务和短作业(进程)优先调度算法1.先来先服务调度算法先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的...

2020-02-17 17:52:38 34

转载 MMU内存管理单元

MMU即内存管理单元(Memory Manage Unit),是一个与软件密切相关的硬件部件,也是理解linux等操作系统内核机制的最大障碍之一。可以说,不懂MMU使很多人一直停滞在单片机与无OS的时代。博主之前对MMU也一直是雾里看花,似懂非懂。最近终于自认为云开雾散后,回头总结,感觉有几个概念是阻碍人们理解MMU的元凶。1)虚拟地址/物理地址 如果处理器没有MMU,CPU...

2020-02-14 19:08:23 55 1

原创 操作系统(一)--启动

计算机启动过程

2020-02-13 19:58:30 83

原创 bootloader进入保护模式的过程

分析bootloader 进入保护模式的过程。从%cs=0 $pc=0x7c00,进入后首先清理环境:包括将flag置0和将段寄存器置0 .code16 cli cld xorw %ax, %ax movw %ax, %ds movw %ax, %es movw %ax, %ss...

2020-02-13 19:57:42 172

原创 Activity的生命周期

七个方法1. onCreate() 它会在Activity 第一次被创建的时候调用。在这个方法中完成Activity的初始化操作,比如说加载布 局、绑定事件等。 2. onStart() 这个方法在Activity由不可见变为可见的时候调用。 3. onResume() 这个方法在Activity准备好和用户进行交互的时候调用。此时的Activity一定位于返回栈的 栈顶,...

2020-02-05 20:54:07 87 2

原创 Android 系统架构

Android大致可以分为四层架构。 1. Linux 内核层 Android 系统是基于 Linux 2.6 内核的,这一层为 Android 设备的各种硬件提供了底 层的驱动,如显示驱动、音频驱动、照相机驱动、蓝牙驱动、Wi-Fi 驱动、电源管理等。2. 系统运行库层 这一层通过一些 C/C++库来为 Android 系统提供了主要的特性支持。如 SQLite 库提 供...

2020-02-05 17:12:54 113

原创 Python创建本地数据库

如果已有SQLite、PostgreSQL 或 MySQL 数据库,可以参考快速入门指南(https://dataset.readthedocs.io/en/latest/quickstart.html)直接连接。然后安装Dataset,pip install dataset。代码示例:import dataset'''# connecting to a S...

2020-02-05 10:44:28 1322

原创 操作系统单内核和微内核的区别

单内核单内核就是从整体上把内核作为一个大过程来实现,同时也运行在一个单独的地址空间上。因此单内核通常以单个静态二进制文件的形式存放于磁盘中。而进程管理、内存管理等是其中的一个个模块,所有内核模块都在这样的一个大内核地址空间上运行。模块之间可以直接调用相关的函数。效率高,紧凑性强。大多数的Unix系统都设计为单内核。Linux也是一个单内核,也就是说,Linux内核运行在单独的内核地址空间上...

2019-12-17 09:41:27 524

原创 CSAPP--Chap10 系统级I/O

输入/输出(I/O): 是指主存和外部设备(如磁盘,终端,网络)之间拷贝数据过程。 高级别I/O函数 scanf和printf <<和>> 使用系统级I/O函数实现 系统级I/O函数。 10.1 Unix I/O 一个Unix 文件就是一个m个字节的序列: 所有I/O设备都被模型化为文件。 而所有的输入和输出都被当做相应文...

2019-12-06 11:39:17 41

原创 连手机logcat,出现read:unexpected EOF

adb logcat查看手机日志出现read:unexpected EOF错误解决:1、增加日志buffer,如logcat -G 20M2、手机开发者设置,增大log size

2019-11-13 17:57:21 63

原创 adb 'grep' 不是内部或外部命令,也不是可运行的程序或批处理文件

出现问题时的命令: adb shell logcat | grep START问题内容:’grep’ 不是内部或外部命令,也不是可运行的程序或批处理文件。解决方法:将logcat | grep START用双引号引起来,即adb shell “logcat | grep START”。...

2019-11-11 18:54:19 229

原创 CSAPP--磁盘存储器

磁盘 机械硬盘有许多片磁盘(platter)组成,每一片磁盘有两面;每一面由一圈圈的磁道(track)组成,而每个磁道会被分隔成不同的扇区(sector)。磁盘的操作流程:所有磁头同步寻道(由柱面号/磁道号控制)--> 选择磁头(有磁头号/盘面号控制) --> 被选中磁头等待扇区到达磁头下方(由扇区号控制)--> 读写该扇区内数据磁...

2019-11-10 21:17:14 39

原创 CSAPP--指令执行的过程

CPU运行程序的过程就是执行一条一条指令的过程。CPU执行指令过程:1.取指令:从PC(IA_32的EIP)所指单元取出指令送指令寄存器(IR),并增量PC。2.指令译码:不同指令功能不同,所以需要不同的操作控制信号。3.源操作数地址计算并取操作数:根据寻址方式确定源操作数地址计算方式,保护模式下的寻址方式如下:4.执行数据操作:在ALU或加法器等运算部件...

2019-11-09 16:30:48 72

原创 windows环境下运行.sh文件

.sh是shell script格式的文件,在Linux环境下是可以直接运行的,到文件所在目录下,执行 ./test.sh如果是在Windows环境下,在CMD窗口是无法直接执行./test.sh 的,这时候可以通过GIT 工具来运行,关于GIt的安装配置参考:https://blog.csdn.net/u013295518/article/details/78746007接...

2019-11-07 23:43:33 203

原创 fork()函数解析

fork()总述: fork调用用于创建一个新进程,把当前的进程分为父进程和子进程,新进程称为子进程,而原进程称为父进程。fork调用一次,返回两次,这两个返回分别带回它们各自的返回值,其中在父进程中的返回值是子进程的PID,而子进程中的返回值则返回 0。 新创建的子进程几乎但是不完全与父进程相同。子进程得到与父进程用户级虚拟地址空间相同的一份拷贝,(包括文本、数据和bss段...

2019-11-03 17:14:00 59

原创 二分查找法

一、需查找和目标值相等的数比如数组 [2, 4, 5, 6, 9],target = 6,返回3,即target 的在数组中的位置。二分查找法的代码如下:int find(int[] nums, int target) { int left = 0, right = nums.length; while (left < right) { int mi...

2019-10-26 19:45:55 266

原创 IA-32常用指令类型

1.传送指令-通用数据传送指令 MOV:一般传送,movb、movw、movl等(b是8位,w是16位,l是32位)。 MOVS:符号扩展传送,movsbw(比如把char型赋值给int型,高8位就用char型变量第一位的符号进行扩展)、movswl。 MOVZ:零扩展传送,movzwl、movzbl等。 XCHG:数据交换 PUSH...

2019-10-20 14:40:53 208

原创 图解归并排序

核心思想:分治法,将已有序的子序列合并,得到完全有序的序列。1. 图解过程归并过程:合并两个有序数组:2.代码实现public static void mergeSort(int[] arr) { sort(arr, 0, arr.length - 1);}public static void sort(int[] arr, int L, int ...

2019-10-06 19:17:03 93

原创 指针和引用的区别

(1)非空区别。在任何情况下都不能使用指向空值的引用,引用相当于别名,所以一个引用必须总是指向某些对象。而指针可以指向空值,为空指针。(2)合法性区别。在使用引用之前不需要测试它的合法性。相反,指针则应该总是被测试,防止其为空。 (3)可修改区别。指针可以被重新赋值以指向另一 个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变,但是指定的对象其内容可以改变。 (4)应...

2019-10-05 15:59:02 33

原创 遍历二叉树的递归解法与非递归解法

树结点定义:public class TreeNode { int val; TreeNode left; TreeNode right; public TreeNode(int val) { this.val = val; }}前序遍历(根->左->右)递归解法:public static void pr...

2019-10-05 10:54:53 57

提示
确定要删除当前文章?
取消 删除