摘要:
如题,显而易见,我们可以依次计算所有数中的1来完成该功能: int NumOfOneBetweenN(int n) { int sum = 0; for(int i=1;i<n;++i) sum += NumOfOne(i); return sum; } int NumOfOne(int i) { 阅读全文
摘要:
RAII(Resource Acquisition Is Initialization),也称为“资源获取就是初始化”,是C++语言的一种利用对象生命周期来控制资源的技术。 简单的说,RAII 的做法是使用一个对象,在其构造时获取资源,在对象生命期控制对资源的访问使之始终保持有效,最后在对象析构的时 阅读全文
摘要:
UDP: 1.无连接: 不需要建立连接,可以直接传输数据 2.不可靠: 没有确认和重传机制,感受不到对方是否收到消息 3.面向数据报: 不能灵活控制读写数据的次数和大小,不能拆分和合并数据,发送10k就必须取10k,取1k剩下的就没了 UDP没有真正意义上的发送缓冲区,调用sendto直接交给内核处 阅读全文
摘要:
死锁: 指多个进程/线程并发执行中,由于争抢资源而造成的阻塞现象。 产生死锁的必要条件: 1.互斥:进程请求的资源是临界资源 2.请求并保持:进程占有了资源,并同时请求其他资源 3.不可剥夺条件:进程占有的资源在未使用完之前,不可被剥夺 4.环路等待 解决死锁的方法: 预防死锁: 破坏产生死锁的条件 阅读全文
摘要:
内存中的堆和栈 堆: 是程序员手动申请的空间,空间用完需要程序员自己手动释放,也可能会由OS回收,分配方式类似链表; 堆比较大,地址向上增长; 堆一般存放对象 栈: 是系统申请的空间,空间用完系统会自动释放; 栈比较小,地址向下增长; 栈一般存放局部变量 数据结构中的堆和栈 堆: 可以看做一颗树,比 阅读全文
摘要:
进程的四大特点: 并发、共享、虚拟、异步。 进程调度便是实现并发的关键一环。 在操作系统中存在多种调度算法,其中有的调度算法适用于作业调度,有的调度算法适用于进程调度,有的调度算法两者都适用。 1.先来先服务(FCFS) 一种简单的调度算法,适用于作业和进程调度。先来先服务算法按照进程/作业到达先后 阅读全文
摘要:
快速排序是交换排序,是冒泡排序的改进版。 快排过程: 1.选定一个分界值 2.分成三个部分(小于分界部分,分界值,大于分界值部分) 3.对于分开的两部分重复上述操作,直到排序完成 C/C++代码: //分界值切分 //挖坑法: int PartSortWakeng(int *a, int begin 阅读全文
摘要:
通过上篇博客知道,二叉搜索树的局限在于不能完成自平衡,从而导致不能一直保持高性能。 AVL树则定义了平衡因子绝对值不能大于1,使二叉搜索树达到了严格的高度平衡。 还有一种能自我调整的二叉搜索树, 红黑树 : 通过标记节点的颜色(红/黑),使其拥有自平衡的二叉搜索树。 红黑树性质 : 性质1:每个节点 阅读全文
摘要:
先说说二叉搜索树: 是有序的二叉树,根值>左节点值,右节点值>根值。 如果要查找某个值,二叉搜索树和二分查找一样,每进行一次值比较,就会减少一半的遍历区间。 但是,如果树插入的值一直递增/递减,就会出现这种情况: 这样,二叉树性能就完全失去了,直接退化成了顺序表,查找效率低下。 由此,引入了能保持性 阅读全文
摘要:
1.现代计算机CPU只会从内存中读取数据,硬盘的数据通过DMA(IO设备直接与内存数据交换)的方式与内存打交道。 2.CPU总线(BUS)周期: T1:向bus发送地址,寻址 T2:bus上撤销地址,准备接受数据 T3:数据读入到数据总线 T4:结束总线周期 电脑主频越高,时钟周期越短,耗时短从而显 阅读全文