精华内容
下载资源
问答
  • 常用图像算法

    千次阅读 2014-05-24 13:12:28
    熟悉医学图像配准算法及实现,如仿射,Demons,FFD,LDDMM等配准算法

    熟悉医学图像配准算法及实现,如仿射,Demons,FFD,LDDMM等配准算法

    熟悉医学图像分割算法及实现,如水平集,ASM,Snake,graph-cut,单纯形网格等分割算法

    熟悉其它医学图像处理算法,如小波分析,图像增强,中心线提取,纹理分析

    熟悉基于机器学习的图像识别算法,如神经网络,ada boost等

    拥有GPU并行计算处理经验者优先

    熟悉最优化算法者优先,如最速下降法,牛顿法,LBFGS等


    展开全文
  • 常用算法 常用算法 常用算法 常用算法 常用算法
  • 经典常用算法经典常用算法经典常用算法经典常用算法
  • 常用排序算法总结常用排序算法总结常用排序算法总结常用排序算法总结常用排序算法总结常用排序算法总结常用排序算法总结常用排序算法总结常用排序算法总结常用排序算法总结
  • 常用经典算法常用经典算法常用经典算法常用经典算法常用经典算法常用经典算法常用经典算法常用经典算法常用经典算法常用经典算法常用经典算法常用经典算法常用经典算法常用经典算法
  • 常用算法讲解常用算法讲解常用算法讲解常用算法讲解常用算法讲解常用算法讲解
  • C语言常用算法C语言常用算法C语言常用算法C语言常用算法C语言常用算法C语言常用算法C语言常用算法C语言常用算法C语言常用算法
  • java实现四种常用排序算法

    万次阅读 多人点赞 2019-03-29 11:20:28
    四种常用排序算法 冒泡排序 特点:效率低,实现简单 思想(从小到大排):每一趟将待排序序列中最大元素移到最后,剩下的为新的待排序序列,重复上述步骤直到排完所有元素。这只是冒泡排序的一种,当然...

    四种常用排序算法

    注:从小到大排

    冒泡排序

    特点:效率低,实现简单
    思想:每一趟将待排序序列中最大元素移到最后,剩下的为新的待排序序列,重复上述步骤直到排完所有元素。这只是冒泡排序的一种,当然也可以从后往前排。

    public void bubbleSort(int array[]) {
    		int t = 0;
    		for (int i = 0; i < array.length - 1; i++)
    			for (int j = 0; j < array.length - 1 - i; j++)
    				if (array[j] > array[j + 1]) {
    					t = array[j];
    					array[j] = array[j + 1];
    					array[j + 1] = t;
    				}
    	}
    

    选择排序

    特点:效率低,容易实现。
    思想:每一趟从待排序序列选择一个最小的元素放到已排好序序列的末尾,剩下的为待排序序列,重复上述步骤直到完成排序。

    	public void selectSort(int array[]) {
    		int t = 0;
    		for (int i = 0; i < array.length - 1; i++){
    			int index=i;
    			for (int j = i + 1; j < array.length; j++)
    				if (array[index] > array[j])
    					index=j;
    			if(index!=i){ //找到了比array[i]小的则与array[i]交换位置
    				t = array[i];
    				array[i] = array[index];
    				array[index] = t;
    			}
    		}
    	}
    

    插入排序

    特点:效率低,容易实现。
    思想:将数组分为两部分,将后部分元素逐一与前部分元素比较,如果前部分元素比array[i]小,就将前部分元素往后移动。当没有比array[i]小的元素,即是合理位置,在此位置插入array[i]

    public void insertionSort(int array[]) {
    		int i, j, t = 0;
    		for (i = 1; i < array.length; i++) {
    			if(a[i]<a[i-1]){
    				t = array[i];
    				for (j = i - 1; j >= 0 && t < array[j]; j--)
    					array[j + 1] = array[j];
    				//插入array[i]
    				array[j + 1] = t;
    			}
    		}
    }
    

    快速排序

    特点:高效,时间复杂度为nlogn。
    采用分治法的思想:首先设置一个轴值pivot,然后以这个轴值为划分基准将待排序序列分成比pivot大和比pivot小的两部分,接下来对划分完的子序列进行快排直到子序列为一个元素为止。

    public void quickSort(int array[], int low, int high) {// 传入low=0,high=array.length-1;
    		int pivot, p_pos, i, t;// pivot->位索引;p_pos->轴值。
    		if (low < high) {
    			p_pos = low;
    			pivot = array[p_pos];
    			for (i = low + 1; i <= high; i++)
    				if (array[i] > pivot) {
    					p_pos++;
    					t = array[p_pos];
    					array[p_pos] = array[i];
    					array[i] = t;
    				}
    			t = array[low];
    			array[low] = array[p_pos];
    			array[p_pos] = t;
    			// 分而治之
    			quickSort(array, low, p_pos - 1);// 排序左半部分
    			quickSort(array, p_pos + 1, high);// 排序右半部分
    		}
    }
    

    测试demo:

    import java.util.Arrays;
    public class sortTest {
    	// 冒泡排序
    	public void bubbleSort(int array[]) {
    		int t = 0;
    		for (int i = 0; i < array.length - 1; i++)
    			for (int j = 0; j < array.length - 1 - i; j++)
    				if (array[j] > array[j + 1]) {
    					t = array[j];
    					array[j] = array[j + 1];
    					array[j + 1] = t;
    				}
    	}
    
    	// 选择排序
    	public void selectSort(int array[]) {
    		int t = 0;
    		for (int i = 0; i < array.length - 1; i++){
    			int index=i;
    			for (int j = i + 1; j < array.length; j++)
    				if (array[index] > array[j])
    					index=j;
    			if(index!=i){ //找到了比array[i]小的则与array[i]交换位置
    				t = array[i];
    				array[i] = array[index];
    				array[index] = t;
    			}
    		}
    	}
    
    	public void insertionSort(int array[]) {
    			int i, j, t = 0;
    			for (i = 1; i < array.length; i++) {
    				if(a[i]<a[i-1]){
    					t = array[i];
    					for (j = i - 1; j >= 0 && t < array[j]; j--)
    						array[j + 1] = array[j];
    					//插入array[i]
    					array[j + 1] = t;
    				}
    			}
    	}
    
    	// 分治法快速排序
    	public void quickSort(int array[], int low, int high) {// 传入low=0,high=array.length-1;
    		int pivot, p_pos, i, t;// pivot->位索引;p_pos->轴值。
    		if (low < high) {
    			p_pos = low;
    			pivot = array[p_pos];
    			for (i = low + 1; i <= high; i++)
    				if (array[i] > pivot) {
    					p_pos++;
    					t = array[p_pos];
    					array[p_pos] = array[i];
    					array[i] = t;
    				}
    			t = array[low];
    			array[low] = array[p_pos];
    			array[p_pos] = t;
    			// 分而治之
    			quickSort(array, low, p_pos - 1);// 排序左半部分
    			quickSort(array, p_pos + 1, high);// 排序右半部分
    		}
    	}
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		int[] array = { 37, 47, 23, 100, 19, 56, 56, 99, 9 };
    		sortTest st = new sortTest();
    		// st.bubbleSort(array);
    		// st.selectSort(array);
    		// st.insertionSort(array);
    		st.quickSort(array, 0, array.length - 1);
    		System.out.println("排序后:" + Arrays.toString(array));
    	}
    }
    
    
    展开全文
  • 计算机常用算法 计算机常用算法 计算机常用算法计算机常用算法 计算机常用算法 计算机常用算法
  • 常用算法设计 常用算法设计 常用算法设计 常用算法设计 常用算法设计 常用算法设计
  • 常用数值算法丛书 Delphi常用数值算法
  • C# 常用常用算法

    2012-02-21 21:49:26
    收集了一些 常用算法 不是自己写的 很简单 希望对你有所帮助 也希望你有所收获
  • 常用数值算法丛书 Delphi常用数值算法
  • 建模常用算法

    2018-01-30 14:53:57
    常用算法程序包常用算法程序包常用算法程序包常用算法程序包常用算法程序包常用算法程序包常用算法程序包
  • 常用算法排序算法

    2007-11-08 21:00:44
    常用算法排序算法常用算法排序算法
  • 常用排序算法

    2019-03-02 22:51:59
    常用排序算法整理 ,
  • 数据挖掘算法——常用分类算法总结

    万次阅读 多人点赞 2019-06-17 10:55:22
    常用分类算法总结分类算法总结NBC算法LR算法SVM算法ID3算法C4.5 算法C5.0算法KNN 算法ANN 算法 分类算法总结 分类是在一群已经知道类别标号的样本中,训练一种分类器,让其能够对某种未知的样本进行分类。分类算法...

    分类算法

    分类是在一群已经知道类别标号的样本中,训练一种分类器,让其能够对某种未知的样本进行分类。分类算法属于一种有监督的学习。分类算法的分类过程就是建立一种分类模型来描述预定的数据集或概念集,通过分析由属性描述的数据库元组来构造模型。分类的目的就是使用分类对新的数据集进行划分,其主要涉及分类规则的准确性、过拟合、矛盾划分的取舍等。分类算法分类效果如图所示。

    常用的分类算法包括:NBC(Naive Bayesian Classifier,朴素贝叶斯分类)算法、LR(Logistic Regress,逻辑回归)算法、ID3(Iterative Dichotomiser 3 迭代二叉树3 代)决策树算法、C4.5 决策树算法、C5.0 决策树算法、SVM(Support Vector Machine,支持向量机)算法、KNN(K-Nearest Neighbor,K 最近邻近)算法、ANN(Artificial Neural Network,人工神经网络)算法等。

    NBC算法

    NBC 模型发源于古典数学理论,有着坚实的数学基础。该算法是基于条件独立性假设的一种算法,当条件独立性假设成立时,利用贝叶斯公式计算出其后验概率,即该对象属于某一类的概率,选择具有最大后验概率的类作为该对象所属的类。
    NBC算法的优点

    1. NBC算法逻辑简单,易于实现;
    2. NBC算法所需估计的参数很少;
    3. NBC 算法对缺失数据不太敏感;
    4. NBC 算法具有较小的误差分类率;
    5. NBC 算法性能稳定,健壮性比较好;

    NBC算法的缺点
    1.在属性个数比较多或者属性之间相关性较大时,NBC 模型的分类效果相对较差;
    2.算法是基于条件独立性假设的,在实际应用中很难成立,故会影响分类效果

    LR算法

    LR 回归是当前业界比较常用的机器学习方法,用于估计某种事物的可能性。它与多元线性回归同属一个家族,即广义线性模型。简单来说多元线性回归是直接将特征值和其对应的概率进行相乘得到一个结果,逻辑回归则是在这样的结果上加上一个逻辑函数。在此选择LR 作为回归分析模型的代表进行介绍。
    LR算法的优点
    1.对数据中小噪声的鲁棒性好;
    2.LR 算法已被广泛应用于工业问题中;
    3.多重共线性并不是问题,它可结合正则化来解决。

    LR算法的缺点
    1.对于非线性特征,需要转换
    2.当特征空间很大时,LR的性能并不是太好

    SVM算法

    SVM 算法是建立在统计学习理论基础上的机器学习方法,为十大数据挖掘算法之一。通过学习算法,SVM 可以自动寻找出对分类有较好区分能力的支持向量,由此构造出的分类器可以最大化类与类的间隔,因而有较好的适应能力和较高的分准率。SVM 算法的目的在于寻找一个超平面H,该超平面可以将训练集中的数据分开,且与类域边界的沿垂直于该超平面方向的距离最大,故SVM 法亦被称为最大边缘算法。

    SVM算法的优点
    1.SVM 模型有很高的分准率;
    2. SVM 模型有很高的泛化性能;
    3. SVM 模型能很好地解决高维问题;
    4. SVM 模型对小样本情况下的机器学习问题效果好。

    SVM算法的缺点
    1.SVM 模型对缺失数据敏感;
    2.对非线性问题没有通用解决方案,得谨慎选择核函数来处理。

    ID3算法

    ID3 算法是一种基于决策树的分类算法,该算法是以信息论为基础,以信息熵和信息增益为衡量标准,从而实现对数据的归纳分类。信息增益用于度量某个属性对样本集合分类的好坏程度。ID3 算法的时间复杂度为O(n*|D|*log|D|)。

    ID3算法的优点

    1. ID3 算法建立的决策树规模比较小;
    2. 查询速度快。

    ID3算法的缺点
    1.不适合处理连续数据;
    2.难以处理海量数据集;
    3.建树时偏选属性值较大的进行分离,而有时属性值较大的不一定能反应更多的数据信息。

    C4.5 算法

    C4.5 算法是ID3 算法的修订版,采用信息增益率来加以改进,选取有最大增益率的分割变量作为准则,避免ID3 算法过度的适配问题。

    C4.5算法优点
    1.C4.5 继承了ID3 优点;
    2.在树构造过程中进行剪枝;
    3.能对不完整数据进行处理;
    4.能够完成对连续属性的离散化处理;
    5.产生的分类规则易于理解,准确率较高;
    6.用增益率来选择属性,克服了用增益选择属性时偏向选择取值多的属性。

    C4.5 算法缺点
    1.构造树时,需要对数据集进行多次的顺序扫描和排序,因而导致算法的低效;
    2.只适合于能驻留于内存的数据集,当训练集达到内存无法容纳时程序无法运行。

    C4.5 用于遥感分类过程中,首先依据通常的方式建立第一个模型。随后建立的第二个模型聚焦于被第一个模型错误分类的记录。以此类推,最后应用整个模型集对样本进行分类,使用加权投票过程把分散的预测合并成综合预测。Boosting 技术对于噪声不大的数据,通常通过建立的多模型来减少错误分类的影响,提高分类精度。

    C5.0算法

    C5.0 算法是 Quinlan 在C4.5 算法的基础上改进而来的产生决策树的一种更新的算法,它除了包括C4.5 的全部功能外,还引入许多新的技术,其中最重要的技术是提升(Boosting)技术,目的是为了进一步提高决策树对样本的识别率。同时C5.0 的算法复杂度要更低,使用更简单,适应性更强,因此具有更高的使用价值。

    C5.0算法的优点
    1.C5.0 模型能同时处理连续和离散的数据
    2.C5.0 模型估计
    模型通常不需要很长的训练时间;
    3.C5.0 引入Boosting 技术以提高分类的效率和精度;
    4.C5.0 模型易于理解,模型推出的规则有非常直观的解释;
    5.C5.0 模型在面对数据遗漏和特征很多的问题时非常稳健。

    C5.0算法的缺点
    目标字段必须为分类字段。

    美国地质调查局(USGS)在进行土地覆盖分类项目过程中研发了支持决策树分类的软件。软件分类模块主要是针对庞大数据量的数据集进行数据挖掘,找出特征,然后建立规则集进行决策分类。在分类模块中采用C5.0 模型来完成决策树分类、形成分类文件,实现遥感影像的分类。

    KNN 算法

    KNN 算法是Cover 和Hart 于1968 年提出的理论上比较成熟的方法,为十大挖掘算法之一。该算法的思路非常简单直观:如果一个样本在特征空间中的k 个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。

    KNN算法的优点
    1.KNN 算法简单、有效;
    2.KNN 算法适用于样本容量比较大的类域的自动分类;
    3.由于KNN 方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN 方法较其他方法更为适合。

    KNN算法的缺点
    1.KNN 算法计算量较大;
    2.KNN 算法需要事先确定K 值;
    3.KNN 算法输出的可解释不强;
    4. KNN 算法对样本容量较小的类域很容易产生误分。

    ANN 算法

    人工神经网络(ANN)算法就是一组连续的输入/输出单元,其中每个连接都与一个权相关。在学习阶段,通过调整神经网络的权,使得能够预测样本的正确类标号来学习。

    ANN算法的优点
    1.能处理数值型及分类型的属性;
    2.分类的准确度高,分布并行处理能力强;
    3.对包含大量噪声数据的数据集有较强的鲁棒性和容错能力。

    ANN算法的缺点
    1.不能观察之间的学习过程;
    2.学习时间过长,甚至可能达不到学习的目的;
    3.对于非数值型数据需要做大量数据预处理工作;
    4.输出结果难以解释,会影响到结果的可信度和可接受程度;
    5.神经网络需要大量的参数,如网络拓扑结构、权值和阈值的初始值。

    小结:

    算法名称收敛时间是否过度拟合是否过渡拟合缺失数据敏感度训练数据量
    NBC存在不敏感无要求
    LR存在敏感无要求
    SVM一般存在敏感小数据量
    ID3存在不敏感小数据集
    C4.5存在不敏感小数据集
    C5.0不存在不敏感大数据集
    ANN存在敏感大数据集
    KNN存在敏感数据量多

    创建了一个技术闲聊群:有兴趣可加我微信,拉你一起讨论杂七杂八的技术,虽然大家都不怎么活跃!
    加好友备注:你的博客名 && 随便给我的任意文章点个赞或留言
    在这里插入图片描述

    展开全文
  • 常用算法简介 算法

    2012-05-08 21:21:44
    常用算法简介 算法,这个介绍了许多基本的算法
  • vb常用数值算法

    2018-08-19 09:44:37
    vb常用数值算法读者只需将光盘上的子目录“VB常用数值算法集”复制到D:\ 下即可。 安装好vb 5.0以上的版本。 然后配合书中的说明,在VB系统下直接调用D:\VB常用数值算法集下以V开头 的子目录中的工程,按运行键,...
  • Visual C++常用数值算法集:Visual C++常用数值算法
  • 常用算法及例题常用算法及例题常用算法及例题
  • C常用算法程序集 解压缩后有许多例子可供参考 都是一些常用的算法
  • Java常用排序算法

    2009-06-25 22:43:31
    Java常用排序算法 Java常用排序算法 Java常用排序算法 Java常用排序算法
  • 常用优化算法

    2017-06-25 20:45:17
    本人总结的常用优化算法: 主要包括梯度下降,共轭梯度法;牛顿法,拟牛顿法;信赖域方法,罚函数法。
  • 算法PPT和常用算法手册算法PPT和常用算法手册算法PPT和常用算法手册算法PPT和常用算法手册算法PPT和常用算法手册算法PPT和常用算法手册
  • 区块链中常用共识算法总结

    万次阅读 多人点赞 2017-09-18 19:15:21
    本文是对区块链技术中涉及的共识算法的学习总结整理。 其中PBFT是联盟链常用共识算法,Raft是私有链常用的共识算法,而PoW(比特币采用)是公有链常用的共识算法......

    本文是对区块链技术中涉及的共识算法的学习总结整理。 其中PBFT是联盟链常用共识算法,Raft是私有链常用的共识算法,而PoW(比特币采用)是公有链常用的共识算法。

    建议对区块链的学习,要分成是公有链还是联盟链,这两种链中一般采用的共识算法是有较大不同的,P2P网络等也有较大的不同。传统的共识算法一般不适用于公有链,而一定程度上适用于联盟链。

    实用拜占庭容错系统PBFT(联盟链中常用)

    拜占庭容错技术(Byzantine Fault Tolerance,BFT)是一类分布式计算领域的容错技术,是一种解决分布式系统容错问题的通用方案。实用拜占庭容错系统(Practical Byzantine Fault Tolerance,PBFT)使拜占庭协议的运行复杂度从指数级别降低到多项式级别,使拜占庭协议在分布式系统中应用成为可能。

    拜占庭容错系统

    拜占庭容错系统是指:在一个拥有 n n n台节点的系统,整个系统,对每个请求满足如下条件:

    • 所有非拜占庭节点使用相同的输入信息,产生同样的结果;
    • 如果输入的信息正确,那么所有非拜占庭节点必须接收这个信息,并计算相应的结果。

    与此同时,在拜占庭系统的实际运行过程中一般假设系统中拜占庭节点不超过 m m m台,并且对每个请求满足2个指标:

    • 安全性——任何已经完成的请求都不会被更改,它可以在以后请求看到;
    • 活性——可以接受并且执行非拜占庭客户端的请求,不会被任何因素影响而导致非拜占庭客户端的请求不能执行。

    拜占庭系统目前普遍采用的假设条件包括:

    1. 拜占庭节点的行为可以是任意的,拜占庭节点之间可以共谋;
    2. 节点之间的错误是不相关的;
    3. 节点之间通过异步网络连接,网络中的消息可能丢失、乱序、延时到达;
    4. 服务器之间传递的信息,第三方可以知晓 ,但是不能窜改、伪造信息的内容和验证信息的完整性;

    发生故障的节点称为拜占庭节点;正常的节点为非拜占庭节点。

    状态机拜占庭系统

    状态机拜占庭系统的特点

    状态机拜占庭系统的特点是整个系统共同维护一个状态,所有节点采取一致的行动,一般包括 3 种协议:一致性协议检查点协议视图更换协议。系统正常运行在一致性协议和检查点协议下,视图更换协议则是只有在主节点出错或者运行缓慢的情况下才会启动,负责维系系统继续执行客户端请求的能力。

    状态机拜占庭系统的核心协议

    一、一致性协议
    一致性协议的目标是使来自客户端的请求在每个服务器上都按照一个确定的顺序执行。在协议中,一般有一个服务器被称作主节点,负责将客户端的请求排序;其余的服务器称作从节点,按照主节点提供的顺序执行请求。所有的服务器都在相同的配置信息下工作,这个配置信息称作view,每更换一次主节点,view就会随之变化。

    一致性协议至少包含3个阶段:发送请求、序号分配和返回结果。根据协议设计的不同,可能包含相互交互、序号确认等阶段。

    一致性协议解决一致性的方法主要有:
    1)服务器之间两两交互,服务器通过将自己获得的信息传递给其他的服务器;
    2)由客户端收集服务器的信息,将收集的信息制作成证明文件再发送给服务器。对于一个包含 3 m + 1 3m+1 3m+1台服务器的拜占庭系统,需要收集到 2 m + 1 2m+1 2m+1台服务器发送的一致信息,才能保证达成一致的非拜占庭服务器数量大于拜占庭服务器数量。

    引申思考:采用PBFT共识算法的区块链系统节点数量的下限和上限?

    二、检查点协议
    拜占庭系统每执行一个请求,服务器需要记录日志。如果日志得不到及时的清理,就会导致系统资源被大量的日志所占用,影响系统性能及可用性。另一方面,由于拜占庭服务器的存在,一致性协议并不能保证每一台服务器都执行了相同的请求,所以,不同服务器状态可能不一致。例如,某些服务器可能由于网络延时导致从某个序号开始,之后的请求都没有执行。因此,拜占庭系统中设置周期性的检查点协议,将系统中的服务器同步到某一个相同的状态。因此,周期性的检查点协议可以定期地处理日志,节约资源,同时及时纠正服务器状态。

    处理日志主要解决的问题就是区分那些日志可以清理,那些日志仍然需要保留。如果一个请求已经被 m + 1 m+1 m+1台非拜占庭服务器执行,并且某一服务器 i i i能够向其他的服务器证明这一点,那么 i i i就可以将关于这个请求的日志删除。目前,协议普遍采用的方式是服务器每执行一定数量的请求,就将自己的状态发送给所有服务器并且执行一个该协议,如果某台服务器接收到 2 m + 1 2m+1 2m+1台服务器的状态,那么其中一致的部分就是至少有 m + 1 m+1 m+1非拜占庭服务器经历过的状态,因此,这部分的日志就可以删除,同时将自己状态更新只较新状态。

    三、视图更换
    在一致性协议里,已经知道主节点在整个系统中拥有序号分配,请求转发等核心能力,支配着这个系统的运行行为。然而一旦主节点自身发生错误,就可能导致从节点接收到具有相同序号的不同请求,或者同一个请求被分配多个序号等问题,这将直接导致请求不能被正确执行。视图更换协议的作用就是在主节点不能继续履行职责时,将其用一个从节点替换掉,并且保证已经被非拜占庭服务器执行的请求不会被篡改。

    视图更换协议一般有两种触发方式:
    1)只由服务器触发,这一类触发方式中,判断服务器一致性是否达成的工作是由服务器自身负责,客户端不能从请求的整个执行过程中获得服务器运行状况的信息;
    2)客户端触发,这一类触发方式中,客户端一般负责判断服务器是否达成一致,如果不达成一致,那么就能判断服务器运行出现问题,如果是主节点的问题就会要求服务器更换主节点。

    视图更换协议需要解决的问题是如何保证已经被非拜占庭服务器执行的请求不被更改。由于系统达成一致性之后至少有 m + 1 m+1 m+1台非拜占庭服务器执行了请求,所以目前采用的方法是:由新的主节点收集至少 2 m + 1 2m+1 2m+1台服务器的状态信息,这些状态信息中一定包含所有执行过的请求;然后,新主节点将这些状态信息发送给所有的服务器,服务器按照相同的原则将在上一个主节点完成的请求同步一遍.同步之后,所有的节点都处于相同的状态,这时就可以开始执行新的请求。

    实用拜占庭容错系统PBFT详解

    实用拜占庭容错系统(Practical Byzantine Fault Tolerance,PBFT),是一类状态机拜占庭系统。

    PBFT的一致性协议如下:PBFT系统通常假设故障节点数为 m m m个,而整个服务节点数为 3 m + 1 3m+1 3m+1个。每一个客户端的请求需要经过5个阶段,通过采用两次两两交互的方式在服务器达成一致之后再执行客户端的请求。由于客户端不能从服务器端获取任何服务器运行的状态信息,PBFT中主节点是否发生错误只能由服务器监测。如果服务器在一段时间内都不能完成客户端的请求,则会触发视图更换协议。
    这里写图片描述

    上图显示了一个简化的PBFT的协议通信模式,其中 C C C为客户端, N 0 N_0 N0~ N 3 N_3 N3表示服务节点,特别的, N 0 N_0 N0为主节点, N 3 N_3 N3为故障节点。整个协议的基本过程如下:
    1)客户端发送请求,激活主节点的服务操作;
    2)当主节点接收请求后,启动三阶段的协议以向各从节点广播请求;

    1. 序号分配阶段,主节点给请求赋值一个序号 n n n,广播序号分配消息和客户端的请求消息 m m m,并将构造pre-prepare消息给各从节点;
    2. 交互阶段,从节点接收pre-prepare消息,向其他服务节点广播prepare消息;
    3. 序号确认阶段,各节点对视图内的请求和次序进行验证后,广播commit消息,执行收到的客户端的请求并给客户端响应。

    3)客户端等待来自不同节点的响应,若有 m + 1 m+1 m+1个响应相同,则该响应即为运算的结果;

    Raft

    Raft是在非拜占庭故障下达成共识的强一致协议在区块链系统中,使用Raft实现记账共识的过程可以描述如下:首先选举一个leader,接着赋予leader完全的权利管理记账。leader从客户端接收记账请求,完成记账操作,生成区块,并复制到其他记账节点。有了leader简化了记账操作的管理。如果leader失效或与其他节点失去联系,这时,系统就会选出新的leader。

    Raft基础

    一个Raft集群通常包含5个服务器,允许系统有2个故障服务器。每个服务器处于3个状态之一:leader、follower或candidate。正常操作状态下,仅有一个leader,其他的服务器均为follower。follower是被动的,不会对自身发出的请求而是对来自leader和candidate的请求做出响应。leader处理所有的客户端请求(若客户端联系follower,则该follower将转发给leader)。candidate状态用来选举leader。

    Raft阶段主要分为两个,首先是leader选举过程,然后在选举出来的leader基础上进行正常操作,比如日志复制、记账等。

    leader选举

    当follower在选举超时时间内未收到leader的心跳消息,则转换为candidate状态。为了避免选举冲突,这个超时时间是一个150~300ms之间的随机数。

    一般而言,在Raft系统中:
    1)任何一个服务器都可以成为一个候选者candidate,它向其他服务器follower发出要求选举自己的请求。
    2)其他服务器同意了,发出OK。如果在这个过程中,有一个follower宕机,没有收到请求选举的要求,此时候选者可以自己选自己,只要达到 N / 2 + 1 N/2+1 N/2+1的大多数票,候选人还是可以成为leader。
    3)这样这个候选者就成为了leader领导人,它可以向follower发出指令,比如进行记账。
    4)以后可以通过心跳进行记账的通知。
    5)一旦这个leader崩溃了,那么follower中有一个成为候选者,并发出邀票选举。
    6)follower同意后,其成为leader,继续承担记账等指导工作。
    在这里插入图片描述

    记账过程

    Raft的记账过程按以下步骤完成:
    1)假设leader领导人已经选出,这时客户端发出增加一个日志的要求;
    2)leader要求follower遵从他的指令,都将这个新的日志内容追加到他们各自日志中;
    3)大多数follower服务器将交易记录写入账本后,确认追加成功,发出确认成功消息;
    4)在下一个心跳中,leader会通知所有follower更新确认的项目。
    对于每个新的交易记录,重复上述过程。

    如果在这一过程中,发生了网络通信故障,使得leader不能访问大多数follower,那么leader只能正常更新它能访问的那些follower服务器。而大多数的服务器follower因为没有了leader,它们将重新选举一个候选者作为leader,然后这个leader作为代表与外界打交道,如果外界要求其添加新的交易记录,这个新的leader就按上述步骤通知大多数follower,如果这时网络故障修复了,那么原先的leader就变成follower,在失联阶段,这个老leader的任何更新都不能算确认,都回滚,接收新的leader的新更新。

    如果想更直观的理解Raft协议,可以看动画演示
    论文原文:In Search of an Understandable Consensus Algorithm
    学习参考:The Raft Consensus Algorithm

    PoW

    PoW的原理可参看这篇博文哈希算法及在区块链中的应用中哈希函数难题友好性这一节,理解了难题友好性,就基本理解了PoW机制的原理。结合比特币去理解PoW。比特币PoW的过程,就是将不同的nonce值作为输入,尝试进行SHA256哈希运算,找出满足给定数量前导0的哈希值的过程。要求的前导0的个数越多,代表难度越大。比特币节点求解工作量证明问题的步骤归纳如下:

    1)生成铸币交易,并与其他所有准备打包进区块的交易组成交易列表,通过Merkle树算法生成Merkle跟哈希;
    2)把Merkle根哈希及其他相关字段组装成区块头,将区块头的80字节数据作为工作量证明的输入;
    3)不停地变更区块头中的随机数nonce,并对每次变更后的区块头做双重SHA256运算,将结果值与当前网络的目标难度做比对,如果满足难度条件,则解题成功,工作量证明完成。

    参考资料:
    拜占庭共识算法之PBFT
    Raft动画演示
    The Raft Consensus Algorithm

    展开全文
  • 常用MP3算法2

    2012-11-21 00:05:46
    常用MP3算法

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 708,044
精华内容 283,217
关键字:

常用图算法