算法

编程基础知识

霸气de小男生 提交于 2020-02-16 19:35:26
编程语言 计算机语言 机器语言 ——由0和1组成的二进制码 汇编语言——可读性,符号化了的机器语言 高级语言——近似于人类语言 编译性语言: 读取所有代码后执行。 解释性语言[JS]: 读取一行代码,执行一行代码。依次类推,直到所有代码执行完毕。 软件开发的流程: 软件计划 需求分析和定义 软件设计(数据结构和算法) 软件实现 测试 运营和维护 开发中的错误: 语法错误 ——不按照规定的书写格式写代码所造成的错误 逻辑错误 ——漏掉本来应该有的步骤,或者步骤的顺序不对 运行错误 ——代码执行后所报的错 编写程序 程序: ​ 1.数据结构: 数据的存储方式,如变量和数组。 ​ 2.算法: 解决一个问题的步骤和方法,不是狭义的数学运算法。 算法 算法的特点: 有穷性:一个算法是一个有限的步骤,而不是无限的。 确定性:每个步骤是确定的,不是含糊的。 有0到多个输入 有1到多个输出 有效性(不要出现公式为:n/0) 伪代码: ​ 分析需求后用中文书写的算法流程,用于分解复杂的问题。 流程图: 椭圆形——起止框 矩形——处理框(执行框) 平行四边形——输入输出框 菱形——判断框 箭头——流程线 来源: https://www.cnblogs.com/Lotus3904/p/12318001.html

(转)TCP的拥塞控制

谁说胖子不能爱 提交于 2020-02-16 19:16:58
转: https://www.cnblogs.com/losbyday/p/5847041.html 1. 拥塞:即对资源的需求超过了可用的资源。若网络中许多资源同时供应不足,网络的性能就要明显变坏,整个网络的吞吐量随之负荷的增大而下降。 拥塞控制: 防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。 拥塞控制所要做的都有一个 前提:网络能够承受现有的网络负荷。 拥塞控制是一个 全局性的过程 ,涉及到所有的主机、路由器,以及与降低网络传输性能有关的所有因素。 流量控制:指点对点通信量的控制,是端到端正的问题。流量控制所要做的就是抑制发送端发送数据的速率,以便使接收端来得及接收。 拥塞控制代价:需要获得网络内部流量分布的信息。在实施拥塞控制之前,还需要在结点之间交换信息和各种命令,以便选择控制的策略和实施控制。这样就产生了额外的开销。拥塞控制还需要将一些资源分配给各个用户单独使用,使得网络资源不能更好地实现共享。 2. 几种拥塞控制方法 慢开始( slow-start )、拥塞避免( congestion avoidance )、快重传( fast retransmit )和快恢复( fast recovery )。 2.1 慢开始和拥塞避免 发送方维持一个拥塞窗口 cwnd ( congestion window )的状态变量。拥塞窗口的大小取决于网络的拥塞程度

浅谈共识机制

你说的曾经没有我的故事 提交于 2020-02-16 14:18:02
区块链是一种去中心化的分布式账本,可以简单理解为分布在全球各个节点的分布式数据库,数据库由区块按时间顺序相连而成,区块中记录的是数笔交易。 POW :Proof of Work(工作量证明)。按劳分配,谁工作量多,谁拿的多。体现在谁的挖矿设备CPU、GPU等更牛逼。缺点就是太费电了,还污染环境。 简单讲就是多劳多得,谁能最快的猜出随机数,谁就能做记账人。特点是去中心化最彻底,可靠安全,但共识时间长,耗能大,需要大量的计算资源去运转。代表:比特币。比特币在Block的生成过程中使用了POW机制,一个符合要求的Block Hash由N个前导零构成,零的个数取决于网络的难度值。要得到合理的Block Hash需要经过大量尝试计算,计算时间取决于机器的哈希运算速度。当某个节点提供出一个合理的Block Hash值,说明该节点确实经过了大量的尝试计算,当然,并不能得出计算次数的绝对值,因为寻找合理hash是一个概率事件。当节点拥有占全网n%的算力时,该节点即有n/100的概率找到Block Hash。 POS :Proof of Stake(股权证明)。按照持有此币的数量比例以及持有的时间,来进行发放利息,跟把钱存银行是类似的。优点是节能,不需要挖矿了。 也叫“股权证明算法”,类似于财产储存在银行,因为POW的越来越中心化,大家就开始心怀忌惮,于是虚拟货币爱好者开始研究另一种共识机制POS

矢量图形绘制算法浅析

霸气de小男生 提交于 2020-02-16 09:52:38
矢量图形的绘制归根结底是任意多边形的绘制。 比如一个填充圆,就是取圆上许多的点依次连接并填充内部构成的图形,虽然人肉眼看到的还是"圆"形,但它却是实实在在的多边形构造的。 再比如说直线,其实也就是4边形,只不过它是一个又窄又长的内部被填充的4边形。 任意多边形是如何绘制于电脑屏幕的呢? 很显然"多边形扫描线填充算法"能很好的工作,当然,这个算法用在矢量图形处理上,细节上还需要有所改进。 特别是要注意到矢量图形绘制中有所谓的"奇偶填充规则","非零填充规则"等,我只说说"(nonzero fill)非零填充" 非零填充规则: "非零填充规则"还有一个值得注意的方面是:边线方向的判断,就是图中多边形边线标识箭头以及+1,-1数字的规则。 A图B图中,绘图顺序为由0号点到1号点(0->1), 0号点的坐标y值比1号点的坐标y值小 ,所以标识数值为1。 绘图顺序为由3号点到0号点(3->0), 3号点的y值比0号点的y值大,所以标识数值为-1。 说到图形矢量,任意多边形又是如何被"矢量"起来的呢? 矢量起来的方法就是像素的 super sample aa(超级采样抗锯齿) 算法。(网上这个资料还是有的,这里就不详谈了-_-!!) 超采样绘制一个多边形,多边形的边缘就有了灰度渐变过度,这就矢量起来了. 这就是矢量图绘制的基础。 来源: https://www.cnblogs.com

KMP算法小结

一世执手 提交于 2020-02-16 08:33:18
KMP算法为字符串匹配时用,能够实现O(n)的复杂度完成匹配。 我们考虑一般的暴力匹配,其复杂度为O(nm)。 然而它的可以优化的。 任何一种优化都是能够充分运用已拥有的信息,KMP算法亦然。 我们设模板串 a ,待匹配串 b 。 它通过一个关于字符串 b 的 next 数组,告诉你当匹配到某位失效的时候,你可以从 b 串之前的某一位继续匹配当前 a 串的某位,而不必从 b 串第一位开始匹配。 具体的求法,可以用 b 串来匹配 b 串来求得。 在这里的 next 数组,个人理解为当第 i 位可以追溯到第 next[i] 位,即若在第 i+1 位匹配失败时,我们可以回到 next[i] 位继续匹配。在这里,我们令 s[i] 为 b 串的前 i 位字符串,则 s[next[i]-1] 是 s[i] 的最大前后缀(就是 s[i] 的后缀的最长前缀,如 aba 是 abaaaabb aba 的最大 前 后缀 ,当最后的 a 的后一位匹配失败时,我们就回到第3+1位继续匹配 ) 1 #include<iostream> 2 #include<string> 3 using namespace std; 4 string qwq,qaq; 5 int next[1000008],m,n; 6 void makenext(){ 7 next[0]=0; 8 int k=0; 9 for (int

算法基础—数据结构—单链表

巧了我就是萌 提交于 2020-02-16 01:21:03
对于链表我想大家应该都不陌生,但是再算法里面,一般以静态链表为准(数组模拟链表)。主要是因为快。 这里总结了基本算法用到的一些模板,不出意外应该就这些,再看代码的时候希望画图理解qwq // head存储链表头,e[]存储节点的值,ne[]存储节点的next指针,idx表示当前用到了哪个节点 int head, e[N], ne[N], idx; //初始化 int intx(){ head = -1; idx = 0; } // 在链表头插入一个数 int add_head(int x){ e[idx] = x; ne[idx] = head; head = idx++; } //将头结点删除,保证头结点存在 int remove(){ head = ne[head]; } //在链表中插入一个数 int add(int k,int x){ e[idx] = x; ne[idx] = ne[k]; ne[k] = idx++; } //再链表中删除一个数 int remove_d(int k){ ne[k] = ne[ne[k]] } 直接根据题目来看吧。 https://www.acwing.com/problem/content/828/ 题目要求就是根据不同的操作来模拟链表,最后遍历输出。 #include<bits/stdc++.h> using namespace

AI算法之Encoder-Decoder 和 Seq2Seq

…衆ロ難τιáo~ 提交于 2020-02-16 01:02:44
Encoder-Decoder 是 NLP 领域里的一种模型框架。它被广泛用于机器翻译、语音识别等任务。 1 什么是 Encoder-Decoder ? Encoder-Decoder 模型主要是 NLP 领域里的概念。它并不特值某种具体的算法,而是一类算法的统称。Encoder-Decoder 算是一个通用的框架,在这个框架下可以使用不同的算法来解决不同的任务。 Encoder-Decoder 这个框架很好的诠释了机器学习的核心思路: 将现实问题转化为数学问题,通过求解数学问题,从而解决现实问题。 Encoder 又称作编码器。它的作用就是「将现实问题转化为数学问题」 Decoder 又称作解码器,他的作用是「求解数学问题,并转化为现实世界的解决方案」 把 2 个环节连接起来,用通用的图来表达则是下面的样子: 关于 Encoder-Decoder,有2 点需要说明: a.不论输入和输出的长度是什么,中间的「向量 c」 长度都是固定的(这也是它的缺陷,下文会详细说明) b.根据不同的任务可以选择不同的编码器和解码器(可以是一个 RNN ,但通常是其变种 LSTM 或者 GRU ) 只要是符合上面的框架,都可以统称为 Encoder-Decoder 模型。说到 Encoder-Decoder 模型就经常提到一个名词—— Seq2Seq。 2 什么是 Seq2Seq? Seq2Seq

Python 进行目标检测

守給你的承諾、 提交于 2020-02-15 23:54:46
一、前言    从学单片机开始鼓捣C语言,到现在为了学CV鼓捣Python,期间在CSDN、简书、博客园和github这些地方得到了很多帮助,所以也想把自己做的一些小东西分享给大家,希望能帮助到别人。记录人生的第一篇博客,mark。 二、图像检测步骤 1. 读取两张图片 第一张是需要检测的小物体,第二章图片是小物体放置在大场景中。代码与输出结果如下所示: import numpy as np import matplotlib.pyplot as plt import cv2 def my_show(img): plt.imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB)) return # 读取图片 img_small=cv2.imread('small.jpg',1) img_big=cv2.imread('big.jpg',1) # 显示图片 plt.figure(figsize=(10,10)) plt.subplot(121) my_show(img_small) plt.subplot(122) my_show(img_big) 2. 提取图片中的特征点 这一步就像我们在区分不同的人的时候,一眼看到外貌就知道此人是谁,而外貌就是这个人的特征。我们希望提取该物体的特征点,以便在不同的场景中识别出来。图片是由像素点构成

7. 设计模式 策略模式

生来就可爱ヽ(ⅴ<●) 提交于 2020-02-15 23:50:10
策略模式的定义与特点 策略(Strategy)模式的定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。 策略模式的主要优点如下。 多重条件语句不易维护,而使用策略模式可以避免使用多重条件语句。 策略模式提供了一系列的可供重用的算法族,恰当使用继承可以把算法族的公共代码转移到父类里面,从而避免重复的代码。 策略模式可以提供相同行为的不同实现,客户可以根据不同时间或空间要求选择不同的。 策略模式提供了对开闭原则的完美支持,可以在不修改原代码的情况下,灵活增加新算法。 策略模式把算法的使用放到环境类中,而算法的实现移到具体策略类中,实现了二者的分离。 其主要缺点如下。 客户端必须理解所有策略算法的区别,以便适时选择恰当的算法类。 策略模式造成很多的策略类。 原文链接 http://www.javaxmw.com/info?intId=26 public class StrategyTest { public static void main(String[] args) { Context c= new Context(); Strategy s= new ConcreteStrategyA(); c

垃圾收集算法

不想你离开。 提交于 2020-02-15 10:56:02
本文节选自《深入理解Java虚拟机:JVM高级特性与最佳实践》【作者:周志明】 由于垃圾收集算法的实现涉及大量的程序细节,而且各个平台的虚拟机操作内存的方法又各不相同,因此本节不打算过多地讨论算法的实现,只是介绍几种算法的思想及其发展过程。 3.3.1 标记-清除算法 最基础的收集算法是“标记-清除”(Mark-Sweep)算法,如它的名字一样,算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象,它的标记过程其实在前一节讲述对象标记判定时已经基本介绍过了。之所以说它是最基础的收集算法,是因为后续的收集算法都是基于这种思路并对其缺点进行改进而得到的。 它的主要缺点有两个:一个是效率问题,标记和清除过程的效率都不高;另外一个是空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致,当程序在以后的运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。 标记-清除算法的执行过程如图3-2所示。 图3-2 “标记-清除”算法示意图 3.3.2 复制算法 为了解决效率问题,一种称为“复制”(Copying)的收集算法出现了,它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉