赛马问题及其变形 25个马,五条跑道,不能计时,只能通过比赛比较出差异。最少需要几场才能求出最快的3匹马假设5个跑道A-C,每一组马对应编号1-5。先来看怎么比出最快的第一匹马,每一组比一次,决出每一组最快的马。每一组最快的马在比一次,决出最快的一匹马。一共5+1=6次。那么怎么求出最快的3匹呢,假设决出来是A1最快,那么此时需要比较A2和B1.。所以top3需要,5+1+1=7次。...
九球称重和得到 4 升的水 有 9 个球,其中 8 个球质量相同,有 1 个球比较重。要求用 2 次天平,找出比较重的那个球。将这些球均分成 3 个一组,共 3 组,选出 2 组称重,如果 1 组比较重,那么重球在比较重的那 1 组;如果 1 组重量相等,那么重球在另外 1 组。对比较重的那 1 组的 3 个球再分成 3 组,重复上面的步骤。有两个杯子,容量分别为 5 升和 3 升,水的供应不断。问怎么用这两个杯子得到 4 升的水。先将3升倒满,放进5升中。在将3升倒满放入5升中,此时3升杯子还剩一升水倒掉5升.
轮流拿书问题 100本书,两个人轮流拿,每次拿1~5本,你先拿,有没有啥策略可以保证你可以拿到最后一本?最后只要剩下6本,这样无论他怎么拿,我都能拿到最后几本 。所以现在分配前面94本,对方每次拿N本,N取值范围为1-5,然后我每次拿6-N本。这样保证每次取得总和是6本。94%6=4.所以我只需要最开始拿3本就可以。...
兔子试毒问题 有1000瓶药水,其中有一瓶是毒药,只要喝上一滴,一天之后必死。先提供一批兔子,找出毒药。时间优先直接1000个兔子,每一瓶尝试一下。空间优先也就是使用最少的兔子。二分法,最开始500,500一组。让一个兔子尝试其中一组,假如死了就换一只兔子,假如安全就可以让这只兔子继续尝试。这样可以排除掉一半。这样1000->500->250->125->63->32->16->8->4->2->1。尝试了10次,即使最坏情况我们只用了10个兔子,但是也
五种IO模型与多路转接 IO=等待+数据拷贝,读IO=等读事件就绪+内核数据拷贝至用户空间。写IO=写事件就绪,用户空间拷贝至内核空间。那么怎么将IO变的高效呢?本质就是尽可能的减少等的比重。五种IO模型举一个钓鱼的例子,钓鱼=等待+将鱼钓上去张三:一直死盯着鱼竿,有鱼上钩然后然后钓上来。李四:李四一会看一下鱼竿,发现没有异动,在这个间隔的期间他可以看书。当再次看的时候有鱼上钩就会吊起。王五:买了一个铃铛挂在杆上,他看都不看鱼竿一眼,没鱼上钩的时候,一直在看书,有鱼上钩的时候,铃铛响的时候再去钓上来。赵六:我有10
子序列与子串问题 最长公共子序列class Solution {public: int longestCommonSubsequence(string text1, string text2) { vector<vector<int>> dp(text1.size()+1,vector<int>(text2.size()+1,0)); for(int i=1;i<=text1.size();i++) {
其他的协议以及整体总结 之前学了,HTTP/HTTPS。TCP/UDP,IP,MAC。辅助协议有DNS(应用层)底层为TCP。DHCP(应用层) 底层为UDP。ARP协议(数据链路层)IP转换为MAC地址。基于TCP的应用层协议Http:超文本传输Https:超文本加密传输FTP:数据连接SSH:加密登录Telnet:远程登录DNS(与其他域名服务器交互时):域名解析基于UDP的应用层协议NFS:网络文件系统TFTP:简单文件传输DHCP:动态主机配置BOOTP:启动协议DNS(服务器与客户端交
网络层与数据链路层 TCP解决了,数据的可靠和效率。IP负责转发和路由。HTTP负责,构建与解析request和response。调用recv和send时触发TCP协议。TCP解决了,可靠性和效率,即什么时候发,发多少的策略。注意他没有发。IP负责,数据转发和路由选择。主机: 配有IP地址, 但是不进行路由控制的设备; 路由器: 即配有IP地址, 又能进行路由控制; 节点: 主机和路由器的统称ip协议格式ip怎么交给上层那个协议?ip有个8位协议,可以向上交付。怎么分离有效载荷和数据?他既有总长度也有4位首
输入一个URL发生了什么 目录孤单小弟 HTTP真实地址查询DNS可靠传输TCP远程定位IP两点传输MAC最终孤单小弟 HTTP一个URL的组成首先浏览器需要对URL进行解析,从而生成发送给web服务器的请求信息。URL是就是请求服务器的文件资源。假如不带文件路径呢?通常服务器会在根目录下放置一个默认的Index.html,返回他即可。浏览器解析出URL,确定了对方的web服务器和文件名。生成请求。一个孤单的HTTP数据包背起了行囊。真实地址查询DNS通常输入的服务器域名是字符串,因为直接输入IP难以记忆。
传输层(TCP与UDP) UDP协议特点无链接,知道对端ip和端口号直接进行传输,不需要建立链接不可靠,假如因为某种原因发送失败也不会返回应用层任何信息面向数据报,有明显的分界,不能灵活控制读写数据的次数和数量面向数据报:应用层交给UDP的思数据,UDP原样发送,既不拆分也不合并。假设发送端,sendto100个字节的数据,那么接收端也必须调用recvfrom一次接收100个字节,而不是循环接收10次一次10个字节协议格式16位UDP总长度,表示整个数据报的最大长度如果校验和出错,就会直接丢弃。怎么将
设计高并发内存池释放流程 目录线程缓存释放中心缓存释放页缓存释放疑问及解答线程缓存释放挂得越来越多,等于MAX_SIZE,慢启动所导致的MAX_SIZE大小。说明都回来了,便开始归还到中心缓存中心缓存释放归还到中心缓存怎么找到,分割出去的Span呢,在这个桶下,同一大小的Span有多个。以下图为例,在申请的时候,页缓存释放疑问及解答...
设计高并发内存池申请流程 实现线程缓存分析完整体架构我们来从最底层实现。取下一个对象之前提到这里使用头四个字节来存下一个对象的。适用于32位以及64位头插与头删将对象头插与头删这样就可以实现从自由链表中放对象,拿对象。和STL空间配置器结构类似,多个不同大小的对象,所以用一个对象数组。假如我们最大也是128个字节,以8为间隔,那么数组长度就是16对象映射到桶现在来一个对象,怎么算他在那个桶呢?TLS技术测试公共头文件#pragma once#include <iostream&
高并发内存池整体架构 目录提要分析线程缓存中心缓存页缓存提要在之前分析的定长内存池和哈希映射的自由链表内存池为什么没解决呢?对于2和3分析线程缓存线程缓存,每个线程独有,当小于MAX_BYTES我们定义为64k,线程从这里申请内存,不需要加锁因为每个线程独享一个cache,这也是这个并发线程池高效的地方。中心缓存中心缓存所有线程共享一个,线程缓存按需从中心缓存获取自己的对象。中心缓存周期性回收自己在线程缓存中的独享,避免一个线程占用太多对象,其他线程吃紧。达到内存分配在多个线程更加均衡的按需调度。所以中心
动态规划练习 乘积最大子数组普通解法class Solution {public: int maxProduct(vector<int>& nums) { int n=nums.size(); vector<int> maxdp(n,0); vector<int> mindp(n,0); maxdp[0]=nums[0]; maxdp[0]=nums[0]; for(int
分割回文串,编辑距离,不同子序列 目录分割回文串普通解法优化时间编辑距离普通解法不同子序列普通解法优化空间分割回文串普通解法class Solution {private: //O(n^3)差点超时 bool isPal(const string& s,int left,int right) { while(left<right) { if(s[left]!=s[right]) return false;
0-1背包问题 有 n 个物品和一个大小为 m 的背包. 给定数组 A 表示每个物品的大小和数组 V 表示每个物品的价值.问最多能装入背包的总价值是多大?举个用例,画图分析普通情况class Solution {public: int backPackII(int m, vector<int> &A, vector<int> &V) { int n=A.size(); vector<vector<int>> dp
动态规划(Dynamic Programming) Dynamic Programming动态规划是分治思想的延伸,就像之前的递归一样,大问题分解成小问题。但是递归有个不好的地方,对于复杂问题时间,空间复杂度十分的高,结果也不会保存。比如:快速排序,没有三数取中优化的话,会导致栈溢出。所以动态规划一般都是采用非递归,而且结果可以保存,这就是他们本质的区别。动态规划特点:把原来的问题分解成几个相似的子问题所有的子问题只需解决一次储存子问题的解动态规划的本质,是对问题状态的定义和状态转移方程的定义(状态以及状态之间的递推关系)所以动规问题
回溯(Flash back)学习 回溯是一种通过穷举所有可能情况来找到所有解的思想。如果一个候选解最后被发现并不是可行解,回溯思想会舍弃它,并在前面的一些步骤做出一些修改,并重新尝试找到可行解。回溯一般会结合在搜索算法中电话号码组合Map建立号码与字符串映射。在代码中,DFS里,curStr+e即一个回溯的过程。例如当前是cur是空串,e依次被映射为abc,先从a开始,继续调用DFS,由于index++,所以e依次被映射到def,所以curStr现在是a,就开始和def两两组合,符合条件入结果数组。执行完后回溯,curStr成为b,
广度优先搜索(Breadth First Search) 学习 目录员工重要性N叉树的层序遍历腐烂的橘子单词接龙最小基因变化打开转盘锁借助队列其先进先出的特点,将要搜索的放在队尾,他是一种地毯式搜索,所以第一次找到目标,一定是最短路径员工重要性/*// Definition for Employee.class Employee {public: int id; int importance; vector<int> subordinates;};*/class Solution {public: in