遍历

聊聊IO多路复用之select、poll、epoll详解

血红的双手。 提交于 2019-12-03 01:44:39
#0 系列目录# 聊聊远程通信 Java远程通讯技术及原理分析 聊聊Socket、TCP/IP、HTTP、FTP及网络编程 RMI原理及实现 RPC原理及实现 轻量级分布式 RPC 框架 使用 RMI + ZooKeeper 实现远程调用框架 深入浅出SOA思想 微服务、SOA 和 API对比与分析 聊聊同步、异步、阻塞与非阻塞 聊聊Linux 五种IO模型 聊聊IO多路复用之select、poll、epoll详解 聊聊C10K问题及解决方案 IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。IO多路复用适用如下场合: 当客户处理多个描述符时(一般是交互式输入和网络套接口),必须使用I/O复用。 当一个客户同时处理多个套接口时,而这种情况是可能的,但很少出现。 如果一个TCP服务器既要处理监听套接口,又要处理已连接套接口,一般也要用到I/O复用。 如果一个服务器即要处理TCP,又要处理UDP,一般要使用I/O复用。 如果一个服务器要处理多个服务或多个协议,一般要使用I/O复用。 与多进程和多线程技术相比, I/O多路复用技术的最大优势是系统开销小,系统不必创建进程/线程 ,也不必维护这些进程/线程,从而大大减小了系统的开销。 目前支持I/O多路复用的系统调用有 select,pselect,poll,epoll ,I/O多路复用就是 通过一种机制

eetCode刷题-递归篇

二次信任 提交于 2019-12-03 01:36:05
递归是算法学习中很基本也很常用的一种方法,但是对于初学者来说比较难以理解(PS:难点在于不断调用自身,产生多个返回值,理不清其返回值的具体顺序,以及最终的返回值到底是哪一个?)。因此,本文将选择LeetCode中一些比较经典的习题,通过简单测试实例,具体讲解递归的实现原理。本文要讲的内容包括以下几点: 理解递归的运行原理 求解递归算法的时间复杂度和空间复杂度 如何把递归用到解题中(寻找递推关系,或者递推公式) 记忆化操作 尾递归 剪枝操作 理解递归的运行原理 例1求解斐波那契数列 题目描述(题目序号:509,困难等级:简单): 求解代码(基础版): class Solution { public int fib(int N) { if(N <= 1) return N; return fib(N - 1) + fib(N - 2); } } 现在以N = 5为例,分析上述代码的运行原理,具体如下图: 递归的返回值很多,初学者很难理解最终的返回值是哪个,此时可以采用上图的方式画一个树形图,手动执行递归代码,树形图的叶节点即为递归的终止条件,树形图的根节点即为最终的返回值。树形图的所有节点个数即为递归程序得到最终返回值的总体运行次数,可以借此计算时间复杂度,这个问题会在后文讲解。 例2 二叉树的三种遍历方式 二叉树的遍历方式一般有四种:前序遍历、中序遍历、后序遍历和层次遍历

基准测试了 ArrayList 和 LinkedList ,发现我们一直用 ArrayList 也是没什么问题的

折月煮酒 提交于 2019-12-03 01:30:24
ArrayList 应该是 Java 中最常用的集合类型了,以至于我们说到集合就会自然而然的想到 ArrayList。很多同学都没有用过除了 ArrayList 之外的其他集合,甚至于都已经忘了除了 ArrayList 之外的其他集合,例如 LinkedList、Vector 等。 那么我们平时只用 ArrayList 是不是正确呢,我既然知道了 LinkedList、Vector ,是不是也要用一下它呢,那么什么情况下用呢。 Vector 是线程安全的集合类型,所以仅在多线程编程的时候才考虑是否用它,凡是为了多线程设计,必然在性能上有所损失, Vector 只是在每个方法上简单的加上 synchronized 关键字,所以性能损失是肯定的。 那么现在就来比较一下 ArrayList 和 LinkedList,都说插入、删除操作多的话用 LinkedList,插入操作多的话用 ArrayList,产生这种说法的大致依据如下。 ArrayList 内部是用 Object 数组作为存储结构,数组是内存中连续的内存空间,并且继承了 RandomAccess 接口,所以可以实现元素的快速访问。但如果不是在末尾插入元素的话,需要拷贝插入位置之后的元素。 LinkedList 内部自己实现的 Node 链表,每个节点都指明了上一节点和下一节点, 所以不要求内存连续

深度优先遍历邻接矩阵版

匿名 (未验证) 提交于 2019-12-03 00:43:02
深度优先遍历邻接矩阵版 package 深度优先遍历邻接矩阵版; import java.util.Stack; //转 public class DFSTest { //存储节点信息 private char[] vertices; //存储边信息 private int[][] arcs; //图中结点数 private int vexnum; //记录结点是否已被遍历 private boolean[] visited; //初始化 public DFSTest(int n){ vexnum = n; vertices = new char[n]; arcs = new int[n][n]; visited = new boolean[n]; for(int i=0;i<vexnum;i++){ for(int j=0;j<vexnum;j++){ arcs[i][j]=0; } } } //添加无向边 public void addEdge(int i,int j){ if(i==j)return; arcs[i][j]=1; arcs[j][i]=1; } // 设置节点集 public void setVertices(char[] vertices) { this.vertices = vertices; } // 设置节点访问标记 public void

二叉树

匿名 (未验证) 提交于 2019-12-03 00:40:02
1、树   树的常用术语 2、二叉树 3、查找节点 4、插入节点 5、遍历树 6、查找最大值和最小值 7、删除节点     ①、删除没有子节点的节点   ②、删除有一个子节点的节点   ③、删除有两个子节点的节点   ④、删除有必要吗? 8、二叉树的效率 9、用数组表示树 10、完整的BinaryTree代码 11、哈夫曼(Huffman)编码   ①、哈夫曼编码    ②、哈夫曼解码 12、总结   前面我们介绍数组的数据结构,我们知道对于有序数组,查找很快,并介绍可以通过二分法查找,但是想要在有序数组中插入一个数据项,就必须先找到插入数据项的位置,然后将所有插入位置后面的数据项全部向后移动一位,来给新数据腾出空间,平均来讲要移动N/2次,这是很费时的。同理,删除数据也是。   那么我们就希望一种数据结构能同时具备数组查找快的优点以及链表插入和删除快的优点,于是 树 诞生了。 回到顶部 1、树    树 ( tree)是一种抽象数据类型(ADT),用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限 节点 通过连接它们的 边 组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。      ①、节点:上图的圆圈,比如A,B,C等都是表示节点。节点一般代表一些实体,在java面向对象编程中,节点一般代表对象。   ②、边

Generator函数

匿名 (未验证) 提交于 2019-12-03 00:40:02
Generator 函数是 ES6 提供的一种异步编程解决方案。 1、所谓“异步”,简单说就是一个任务分成两段,先执行第一段,然后转而执行其他任务,等做好了准备,再回过头执行第二段。 2、异步编程方式: ( 1 )回调函数 ( 2 )事件监听 ( 3 )发布/订阅者 ( 4 ) Promise 对象 3、所谓回调函数,就是把第二段单独写在一个函数里面,等到重新执行这个任务的时候,就直接调用这个函数。 回调函数的异步方式容易形成多重嵌套,多个异步操作形成了强耦合,只要有一个操作需要修改,它的上层回调函数和下层回调函数,可能都要跟着修改。这种情况就称为”回调函数地狱”(callback hell)。 Promise可以解决callback hell问题,Promise对象允许回调函数的嵌套,改成链式调用。 二、什么是Generator? 语法上,可以把理解成,Generator 函数是一个状态机,封装了多个内部状态。 形式上,Generator 函数是一个普通函数。 整个Generator函数就是一个封装的异步任务,或者说是异步任务的容器,异步操作需要暂停的地方,都用yield语句。 Generator函数特征: (1)function 关键字和函数之间有一个星号(*),且内部使用yield表达式,定义不同的内部状态。 (2)调用Generator函数后,该函数并不执行

先序遍历建立并输出二叉树(递归算法)

匿名 (未验证) 提交于 2019-12-03 00:39:02
原文地址为: 先序遍历建立并输出二叉树(递归算法) //代码如下: #include<stdio.h> #include<stdlib.h> typedef struct Node //二叉树结构定义 { char data; struct Node *lchild; struct Node *rchild; }Bitree; void CreateBiTree(Bitree *&t) //先序遍历创建二叉树 { char s; scanf("%c",&s); if(s=='#') t=NULL; else { t=(Bitree *)malloc(sizeof(Node)); t->data=s; CreateBiTree(t->lchild); CreateBiTree(t->rchild); } } void Output(Bitree *t) //先序遍历输出二叉树 { if(t!=NULL) { printf("%c ",t->data); Output(t->lchild); Output(t->rchild); } } int main() { Bitree *root; printf("请以先序遍历依次为二叉树赋值:"); CreateBiTree(root); printf("以先序遍历输出二叉树:"); Output(root); printf("\n");

图的遍历算法:DFS、BFS

匿名 (未验证) 提交于 2019-12-03 00:39:02
在图的基本算法中,最初需要接触的就是图的遍历算法,根据访问节点的顺序,可分为深度优先搜索( DFS)和 广度优先搜索( BFS )。 DFS(深度优先搜索)算法 Depth-First-Search 深度优先算法,是一种用于遍历或搜索树或图的算法。沿着树的深度遍历树的节点,尽可能深的搜索树的分支。 当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。 这一过程一直进行到已发现从源节点可达的所有节点为止。 如果还存在未被发现的节点, 则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。属于盲目搜索。 DFS可用堆栈(Stack)和递归(Recursive)两种方法实现 HashSet::常量添加,删除和搜索 HashMap:将每个节点链接到发现它的节点 堆栈和递归实现过程(伪代码): BFS (广度优先搜索)算法 Breadth-First-Search BFS是从根节点开始,沿着树的宽度遍历树的节点。 如果所有节点均被访问,则算法中止。 广度优先搜索的实现本篇笔记采用队列。 deque:删除一个元素 HashMap:将每个节点链接到发现它的节点 和DFS唯一不同的是BFS使用队列来实现,伪代码如下: 学习参考资料: 深度优先和广度优先的Python实现 【Python算法】遍历(Traversal)、深度优先(DFS)、广度优先

Android 知识点总结 持续更新

匿名 (未验证) 提交于 2019-12-03 00:38:01
Javaƪ 1、ArrayList和LinkedList区别 相同点:1、都实现List 类型 内部结构 顺序遍历速度 随机遍历速度 追加代价 插入代价 删除代价 占用内存 ArrayList 数组 高 高 中 高 高 低 LinkedList 双向链表 高 低 低 低 低 2、ArrayLis和Vector区别 相同点:1、都实现List 不同点:1、ArrayList线程不安全的,Vector线程安全,单线程中ArrayList性能更好 3、fori 与foreach性能比较 100条数据 foreach 遍历ArrayList花费时间0 foreach 遍历LinkedList花费时间0 1000条数据 foreach 遍历ArrayList花费时间5 foreach 遍历LinkedList花费时间6 10000条数据 foreach 遍历ArrayList花费时间3 foreach 遍历LinkedList花费时间105 100000条数据 foreach 遍历ArrayList花费时间13 foreach 遍历LinkedList花费时间11107 200000条数据 foreach 遍历ArrayList花费时间29 foreach 遍历LinkedList花费时间80035 1000000条数据 foreach 遍历ArrayList花费时间143 foreach

剑指offer--重建二叉树

匿名 (未验证) 提交于 2019-12-03 00:37:01
题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 必备知识点:前序遍历(根左右), 中序遍历(左根右),前序遍历第一个数1必是根节点,对应到中序遍历中根节点的位置,左边的数位于左子树,右边的数位于右子树;可以看出,1节点同时拥有左右子树;然后, 前序遍历中第二个数字2作为节点,对应到中序遍历中,左边为左子树,同时,右边没有数,所以2节点没有右子树。所以,可以通过递归实现二叉树重建。 TreeNode* reConstructBinaryTree(vector<int> pre, vector<int> vin) { if (pre.empty() == NULL || vin.empty() == NULL) return NULL; size_t index = 0; for (; index < vin.size(); index++) { if (vin[index] == pre[0]) break; } TreeNode* root = new TreeNode(pre[0]); vector<int> pre_left, vin_left; vector<int> pre