算法

Nagle算法

余生长醉 提交于 2020-01-25 18:54:29
简介 Nagle算法 是以他的发明人John Nagle的名字命名的,它用于自动连接许多的小 缓冲 器消息;这一过程(称为nagling)通过减少必须发送包的个数来增加 网络 软件系统的效率。Nagle算法于1984年定义为福特航空和通信公司IP/TCP拥塞控制方法,这使福特经营的最早的专用 TCP/IP网络 减少拥塞控制,从那以后这一方法得到了广泛应用。Nagle的文档里定义了处理他所谓的小包问题的方法,这种问题指的是应用程序一次产生一字节数据,这样会导致 网络 由于太多的包而过载(一个常见的情况是发送端的" 糊涂窗口综合症(Silly Windw Syndrome) ")。从键盘输入的一个字符,占用一个字节,可能在传输上造成41字节的包,其中包括1字节的有用信息和40字节的标题数据。这种情况转变成了4000%的消耗,这样的情况对于轻负载的 网络 来说还是可以接受的,但是重负载的福特网络就受不了了,它没有必要在经过节点和网关的时候重发,导致包丢失和妨碍传输速度。 吞吐量 可能会妨碍甚至在一定程度上会导致连接失败。Nagle的算法通常会在TCP程序里添加两行代码,在未确认数据发送的时候让发送器把数据送到 缓存 里。任何数据随后继续直到得到明显的数据确认或者直到攒到了一定数量的数据了再发包。尽管Nagle的算法解决的问题只是局限于福特 网络 ,然而同样的问题也可能出现在ARPANet

windows上关闭Nagle算法

£可爱£侵袭症+ 提交于 2020-01-25 18:53:48
下面的设置可以调整或禁用 nagel 算法。禁用 nagel 算法以后, 允许很小的包没有延迟立即发送。建议对某些游戏关闭 nagel 算法, 这样做对文件传输/吞吐量有负面影响。默认状态( 开启nagel )为了提高性能, 会把几个小数据包合并一起, 为了有效传输更大的数据包。虽然这提高了整体性能,并降低了TCP/ IP开销, 但可能会短暂延迟较小的数据包的传输。切记禁用 Nagle 算法可能对文件传输有一些负面影响, 只能帮助某些游戏减少延迟. 为了实现这个调整,在注册表编辑器(开始>运行> REGEDIT)找到: 此设置配置最大数量的ACKs ( Windows XP/2003/Vista/2008 ) HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{NIC-id} 将有多个网卡接口有列出,例如: {1660430C-B14A-4AC2-8F83-B653E83E8297}. 找到与你 IP 地址相同的地址, 创建一个新的 DWORD 值: TcpAckFrequency=1 解释:(DWORD value, 1=disable, 2=default, 2-n=send ACKs if outstanding ACKs before timed interval

KMP算法视频推荐

夙愿已清 提交于 2020-01-25 18:36:02
KMP算法讲解 b站正月点灯笼版本 这个讲解的很深入浅出 三哥版本 这个讲的也不错,用的字符串例子也上面一个复杂一点 如果看不懂可以看第一个,再看第二个 总结:KMP算法比暴力算法,能更快地找到目标字符串,主要是因为前缀表的创造 只要理解好公共前后缀,以及如何使用,就能明白KMP算法为什么比暴力算法要快的原因了 来源: CSDN 作者: c20171118 链接: https://blog.csdn.net/c20171118/article/details/103968611

算法运行时间复杂度

試著忘記壹切 提交于 2020-01-25 18:23:57
算法的运行时间复杂度分析,一般是求输入规模作为自变量,运行时间作为因变量的函数。并不是求所有语句执行的真实代价,是考虑算法运行时间的增长率(增长的量级),只求出公式中的最高次项,忽略低次项和系数。 经常的情况是,输入规模相同,但某种输入会使算法的运行时间其他输入更长。所以算法的时间复杂度可能会有个定语修饰。 最坏情况下:某种输入下,运行时间最长的情况 平均情况下:概率分布分析,算法时间复杂度的期望 最好情况下:某种输入下,运行时间最短的情况 时间复杂度分析用到的渐进记号 O:算法运行的渐近上界 当得到算法在最坏情况下运行时间上界为O(f(n)),可以说算法在任何情况下运行时间上界是O(f(n)). 因此特性,多数时候要求找到算法的渐近上界。 Ω:算法运行的渐近下界 当得到算法在最好情况下运行时间下界为 Ω(f(n)),可以说算法在任何情况下运行时间下界是 Ω(f(n)). θ:算法运行的确界 算法运行时间T(n)=θ(f(n))当且仅当算法时间复杂度T(n)=O(f(n))且T(n)=Ω(f(n)) o记号:非渐近紧确的上界 比如:T(n)=2n,有T(n)=O(n).那么n^2是T(n)的上界,但不是紧确的上界,有T(n)=o(n^2) ω记号:非渐近紧确的下界,ω和Ω的关系如o和O的关系 几种常见的算法运行时间渐近上界,根据函数性质可知运行时间对比(输入规模足够大): O(1)

Head First设计模式之目录

孤街醉人 提交于 2020-01-25 16:57:21
  这是学习的第一个设计模式,而书中写的实例相对比较复杂,参考了网上的文章进行总结 一、定义   策略模式(strategy pattern): 定义了算法族, 分别封闭起来, 让它们之间可以互相替换, 此模式让算法的变化独立于使用算法的客户.    策略模式是针对一组算法,将每个算法封装到具有公共接口的独立的类中,从而使它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。 设计原则一   找出应用中需要变化之处,把它们独立出来、不要和那些不需要变化的代码混在一起 设计原则二   针对接口编程,而不是针对实现编程 设计原则三   多用组合、少用继承 二、结构 策略模式是对算法的包装,是把使用算法的责任和算法本身分割开,委派给不同的对象负责。策略模式通常把一系列的算法包装到一系列的策略类里面。用一句话慨括策略模式就是——“将每个算法封装到不同的策略类中,使得它们可以互换”。 下面是策略模式的结构图: 该模式涉及到三个角色: 环境角色(Context):持有一个Strategy类的引用 抽象策略角色(Strategy):这是一个抽象角色,通常由一个接口或抽象类来实现。此角色给出所有具体策略类所需实现的接口。 具体策略角色(ConcreteStrategy):包装了相关算法或行为。 三、实现 以下以计算个人所得税为例 namespace StrategyPattern

C++STL概览

怎甘沉沦 提交于 2020-01-25 16:53:52
引言 C++ STL可以分为标准容器,算法和函数对象,迭代器和分配器,利用C++标准程序库,可以大量减少我们的代码,提高代码的稳定性和健壮性。 标准容器 C++标准容器分为序列容器和关联容器,对于序列容器,C++提供的基本序列有 vector 支持随机访问,不适合做插入和删除操作频繁的场景 list 双向链表,适合做元素的插入和删除,不是随机访问 deque 也是一个双端序列,但是经过优化,其双端操作效率类似list,随即访问效率接近vector。 从它们出发,通过定义适当的借口,生成了 stack 默认用deque实现 queue 默认是deque实现 priority_queue 默认是vector保存元素,实现最可能是heap 对于关联容器,C++提供的有: map 映射 mulitimap 多重映射,相比map,允许重复的key set 被看做是一个map,其中的值是无关紧要的 mulitiset 相比set,允许重复的key bitset 位集合 hash_map 散列映射,通过实现一个散列函数,将容器实现为一个散列表,以减少查找元素所需要的时间 标准容器具体用法可以参考C++在线手册STL容器: http://www.cplusplus.com/reference/stl/ 算法和函数对象 容器本身之所以有用,是因为容器提供了一些基本操作,如确定大小,迭代,复制,排序

操作系统 - 磁盘调度

只谈情不闲聊 提交于 2020-01-25 10:24:50
转速:r 每转一圈所需要的时间 1/r 寻道时间=磁臂启动时间 + 磁头跨越一个磁道的时间 × 跨越磁道的个数 传输时间 / 转一圈的时间 = 传输的数据大小 / 总数据大小 操作系统唯一可以优化的时间:寻道时间 引入了磁盘调度算法 : @ 先来先服务FCFS @ 最短寻找时间优先算法:寻找此刻离磁头最近的算法 , 保证每次的寻道时间最短 类似于贪心算法,局部最优未必是整体最优 缺点:可能陷入局部的来回,产生饥饿现象 @扫描算法:只有移动到最外侧 边界 时候,才可以往内侧 边界 移动 只有移动到最内侧的时候,才可以往最外侧移动(比较像来回跑,只有接触线了才能掉头) 注意:必须是移动到最边界200才能回头,即使184-200之间没有请求了,也不能掉头,必须到200才掉头 缺点一; 边边有一些没有请求的磁道,但是依然要扫描 缺点二:各个位置磁道响应不平均 在两侧的磁道被访问的频率更高,而在中间的访问更困难一些, @LOOK算法 扫描算法的缺点一的改进:边移动边观察 @循环扫描算法 C-SCAN 针对扫描算法缺点二的改进 扫描到边界以后,直接掉头回到另一个边界的起点,中间不处理请求 结合以上两个缺点的改进 得出的算法 @C-LOOK算法 来源: CSDN 作者: AKUANer 链接: https://blog.csdn.net/AKUANer/article/details

基于矩阵分解的推荐算法,简单入门

假装没事ソ 提交于 2020-01-25 10:14:15
基于矩阵分解的推荐算法,简单入门 转自:http://www.cnblogs.com/kobedeshow/p/3651833.html 本文将要讨论基于矩阵分解的推荐算法,这一类型的算法通常会有很高的预测精度,也活跃于各大推荐系统竞赛上面,前段时间的百度电影推荐最终结果的前10名貌似都是把矩阵分解作为一个单模型,最后各种ensemble,不知道正在进行的阿里推荐比赛( http://102.alibaba.com/competition/addDiscovery/index.htm ),会不会惊喜出现。。。。好了,闲话不扯了,本文打算写一篇该类型推荐算法的入门篇 目录 一,基于矩阵分解的推荐算法相关理论介绍 二,C++代码实现 三,总结跟展望一下 四,后续计划 一,基于矩阵分解的推荐算法相关理论介绍 我们知道,要做推荐系统,最基本的一个数据就是,用户-物品的评分矩阵,如下图1所示 图1 矩阵中,描述了5个用户(U1,U2,U3,U4 ,U5)对4个物品(D1,D2,D3,D4)的评分(1-5分),- 表示没有评分,现在目的是把没有评分的 给预测出来,然后按预测的分数高低,给用户进行推荐。 如何预测缺失的评分呢?对于缺失的评分,可以转化为基于机器学习的回归问题,也就是连续值的预测,对于矩阵分解有如下式子,R是类似图1的评分矩阵,假设N*M维(N表示行数,M表示列数)

数据结构和算法关系

好久不见. 提交于 2020-01-25 09:26:57
数据结构:数据与数据之间的结构关系(数组、队列、树、图等结构) 算法:解决问题的步骤 总结: 1、程序 = 数据结构 + 算法 。数据是程序的中心。数据结构和算法两个概念间的逻辑关系贯穿了整个程序世界,首先二者表现为不可分割的关系。没有数据间的有机关系,程序根本无法设计。 2、数据结构与算法关系:数据结构是底层,算法高层。数据结构为算法提供服务。算法围绕数据结构操作。 3、解决问题(算法)需要选择正确的数据结构。例如:算法中经常需要对数据进行增加和删除用链表数据结构效率高,数组数据结构因为增加和删除需要移动数字每个元素所有效率低。 4、数据结构特点:每种数据结构都具有自己的特点。例如:队列:先进先出。栈:先进后出。等等 5、算法的特性:算法具有五个基本特征:输入、输出、有穷性、确定性和可行性。 6、数据结构应用:数据结构往往同高效的检索算法、索引技术、排序算法有关 7、数据结构(逻辑数据结构)通过计算机语言来实现数据结构(存储数据结构)。例如:树型数据结构:通过计算机语言中的数组(节点)和指针(指向父节点)来实现。 8、存储结构:逻辑数据结构的实现。存储结构通过计算机语言实现。 例如:堆数据结构,堆是一棵完全二叉树,所以适宜采用顺序存储结构(顺序存储:数组),这样能够充分利用存储空间。 9、算法目的:算法是为数据结构服务。例如:数据结构通常伴随有查找算法、排序算法等 10

C++——排序算法代码实现

梦想的初衷 提交于 2020-01-25 09:26:18
1.头文件&&结构体定义 # include <iostream> # include <ctime> using namespace std ; # define MaxLength 500 //定义最大长度 typedef int ElemType ; typedef struct SqList { int length ; //长度 ElemType * data ; //定义data指针用于后续申请空间 } SqList ; void InitSqList ( SqList & L ) //初始化----申请空间 { L . data = new ElemType [ MaxLength + 1 ] ; } 2.插入排序 void InsertSqListSort ( SqList & L ) //插入排序 { L . data [ 0 ] = 0 ; int i = 2 , j ; //定义i,j用于后续循环计数 for ( i ; i <= L . length ; i ++ ) { if ( L . data [ i ] < L . data [ i - 1 ] ) //如果后一个数比前一个数小 { L . data [ 0 ] = L . data [ i ] ; //待插入的数存入哨兵L.data[0]中 L . data [ i ] = L . data [ i