算法

数据结构的基本概念

扶醉桌前 提交于 2020-01-18 08:41:43
数据元素:是组成数据的、有一定意义的基本单位。在计算机中通常作为总体处理。也被称为记录。 数据项:一个数据元素能够有若干个数据项组成。 数据项是数据不可切割的最小单位。 数据对象:是性质同样的数据元素的集合。是数据的子集。 结构:结构是指各个组成部分相互搭配的排列的方式。不容数据元素之间不是独立的。而是存在特定关系,我们将这些特定关系的称为结构。 数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。 逻辑结构:是指数据对象中数据元素之间的相互关系。 分为下面四种: 1、集合结构: 集合结构的数据元素除了通数据一个集合外,它们之间没有其它关系。 各个数据元素是“平等”的。他们的共同属性是“同属于一个集合”。数据结构中的集合关系就类似数学中的集合。 2、线性结构:线性结构中的数据元素之间的一对一的关系。 3、树形结构:树形结构中的数据元素之间存在一种一对多的层次关系 4、图形结构:图形结构的数据元素是多对多的关系。 物理结构:(存储结构)指数据的逻辑结构在计算机中的存储形式。存储器主要是针对内存而言,像硬盘、软盘、光盘等外部存储器的数据组织通经常使用文件结构描写叙述。 数据的存储元素直接按的逻辑关系。是实现物理结构的重点和难点。 数据元素的存储结构形式有两种:顺序存储和链式存储。 1、顺序存储结构:是把数据元素存放在地址连续的存储单元里。其数据间的逻辑关系和物理关系是一致的。

分布式均匀算法--hash性一致算法--hash slot(转)

故事扮演 提交于 2020-01-18 08:02:32
目录   1、redis cluster介绍   2、最老土的hash算法和弊端(大量缓存重建)   3、一致性hash算法(自动缓存迁移)+虚拟节点(自动负载均衡)     不用遍历 --》 hash算法: 缓存位置= hash(key)%n     新增/减少 节点 --》缓存位置失效--》hash环     hash环 节点少--》数据倾斜--》添加虚拟节点   4、redis cluster的hash slot算法 分布式寻址算法 hash 算法(大量缓存重建) 一致性 hash 算法(自动缓存迁移)+ 虚拟节点(自动负载均衡) redis cluster 的 hash slot 算法 1、redis cluster介绍  redis cluster   (1)自动将数据进行分片,每个master上放一部分数据   (2)提供内置的高可用支持,部分master不可用时,还是可以继续工作的  在redis cluster架构下,每个redis要放开两个端口号,比如一个是6379,另外一个就是加10000的端口号,比如16379  16379端口号是用来进行节点间通信的,也就是cluster bus的东西,集群总线。cluster bus的通信,用来进行故障检测,配置更新,故障转移授权  cluster bus用了另外一种二进制的协议,主要用于节点间进行高效的数据交换

算法第三章实践

﹥>﹥吖頭↗ 提交于 2020-01-18 05:46:11
1:实践题目:编辑距离问 2:问题描述:设A和B是2个字符串。要用最少的字符操作将字符串A转换为字符串B。这里所说的字符操作包括 (1)删除一个字符; (2)插入一个字符; (3)将一个字符改为另一个字符。 将字符串A变换为字符串B所用的最少字符操作数称为字符串A到 B的编辑距离,记为d(A,B)。 对于给定的字符串A和字符串B,计算其编辑距离 d(A,B) 3:算法描述:定义一个用于存放从A字符串i转变为B字符串j所需要的最小次数的二维数组d[n+1][m+1[(nm代表字符串AB的长度)初始化d[i][0] = i;表示将长为i的字符串变为空串B所需要的次数i;d[0][j]= j,表示将空串A变为长为J的字符串B所需的次数j;然后从d[1][1]开始填表,若a[i] = b[j],则A的第i个字符不用做修改,则d[i][j] = d[i-1[[j-1];若不等于,则需进行操作,可从子串d[i-1[j]的基础上增加一个数,或子串d[i][j-1]的基础上删掉一个数,或子串的d[i-1][j-1]的情况下修改一个,从这三个操作中取一个最小的值+1;即可得到d[i][j]; 主要代码: int getlength(char *a, char *b){ int lengthA = strlen(a); int lengthB = strlen(b); for(int i = 0; i

算法第三章上级实践报告

混江龙づ霸主 提交于 2020-01-18 05:45:58
1. 实践题目: 编辑距离问题 2. 问题描述 给出两个字符串A和B,要用最少的字符操作将字符串A转换为字符串B。字符操作包括: (1)删除一个字符; (2)插入一个字符; (3)将一个字符改为另一个字符。编辑距离即将字符串A变换为字符串B所用的最少字符操作数,可记为d(A,B),求出给出的两个字符串A和B的编辑距离。 3. 算法描述 定义一个dp[i][j]数组,用于记录将 A串的前i个字符转变为B串的前j个字符 所需的编辑距离,初始化dp[i][0]=i,dp[0][j]为j,表示将A串转变为空串所需的编辑距离,以及将空串转变为B串的编辑距离。dp[i-1][j]表示删除A串中的一个字符,dp[i-1][j]表示添加A串中的一个字符,dp[i-1][j-1]表示修改A串中的一个字符,从A字符串的开头开始遍历,进行动态规划操作,取各操作中的最小值。 代码如下: 1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 int dp[10005][10005]; 5 char str1[2005],str2[2005];//str1表示字符串A,str2表示字符串B 6 int main(){ 7 scanf("%s",str1); 8 scanf("%s",str2); 9 int len1 =

立体匹配算法SGBM

人走茶凉 提交于 2020-01-18 05:12:04
SGBM算法,作为一种全局匹配算法,立体匹配的效果明显好于局部匹配算法,但是同时复杂度上也要远远大于局部匹配算法。 原文链接: https://blog.csdn.net/renshengrumenglibing/article/details/8525328SGBM的基本原理 SGBM的基本步骤涉及:预处理、代价计算、动态规划以及后处理 预处理 Step1:SGBM采用水平 Sobel算子 ,把图像做处理,公式为: Sobel(x,y)=2[P(x+1,y)-P(x-1,y)]+ P(x+1,y-1)-P(x-1,y-1)+ P(x+1,y+1)-P(x-1,y+1) Step2:用一个函数将经过水平Sobel算子处理后的图像上每个像素点(P表示其像素值)映射成一个新的图像:PNEW表示新图像上的像素值。映射函数: 预处理实际上是得到图像的梯度信息 。经预处理的图像保存起来,将会用于计算代价。 预处理参数 1:preFilterCap: 水平sobel预处理后,映射滤波器大小默认为15 int ftzero =max(params.preFilterCap, 15) | 1; opencv测试例程test_stereomatching.cpp中取63。 代价计算 代价有两部分组成: 1经过预处理得到的图像的梯度信息经过 基于采样的方法得到的梯度代价

数据结构与算法概述

依然范特西╮ 提交于 2020-01-18 04:36:23
一、基本概念和术语 数据:是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。 数据元素:是组成数据的、有一定意义的基本单位,在计算机中通常作为整体进行处理。也被称为记录。 数据项:一个数据元素可以由多个数据项组成。数据项是数据不可分割的最小单位。 数据对象:是性质相同的数据元素的集合,是数据的子集。 数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。 二、逻辑结构与物理结构 逻辑结构:是指数据对象中数据元素之间的相互关系。 物理结构:是指数据的逻辑结构在计算机中的存储形式。 数据结构中的“线性表”、“栈与队列”、“串”、“树”、“图”的逻辑结构结构都基于以下的四种形式构思,在计算机中的存储都是基于以下两种结构实现存储。 三、算法 算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作 。 算法的特性: (1)输入输出 (2)有穷性(3)确定性 (4)可行性 算法效率的度量方法: (1)时间复杂度 1. 一般情况下,算法的基本操作重复执行的次数是模块n的某一个函数f(n),因此,算法的时间复杂度记做:T(n)=O(f(n)) 分析:随着模块n的增大,算法执行的时间的增长率和 f(n) 的增长率成正比,所以 f(n) 越小,算法的时间复杂度越低,算法的效率越高。 2.

几种常见的加密算法

China☆狼群 提交于 2020-01-18 03:23:32
一、概念 数据加密 的基本过程就是对原来为明文的文件或数据按某种 算法 进行处理,使其成为不可读的一段代码为“密文”,使其只能在输入相应的 密钥 之后才能显示出原容,通过这样的途径来达到保护数据不被非法人窃取、阅读的目的。 该过程的逆过程为解密,即将该 编码 信息转化为其原来数据的过程。 简单来说,就是 把某一段数据(明文),按照“某种规则”转换成另外一段不可读的数据(密文)。这里选定的“规则”,就是加密算法。 理所当然,当别人拿到“密文”,解析出“明文”的难度取决于加密算法的破解难度。 二、几种常见的加密算法 1、 Base64算法 原码 /** * Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一。 */ public class Base64Util { /* 我们知道Java中是用"8个二进制数字"表示一个实际的字节。 比如:我要用Base64编码一个字符串“abc”,实际算法如下: 'a','b','c'的ASCII标准编码分别为(十进制)97,98,99,因此用二进制表示“abc”字符串就是: 01100001,01100010,01100011 ---3组,每组8字节 Base64的原理:将这三组8字节,分成4组6字节 011000,010110, 001001,100011 ---4组,每组6字节 高位补0 00011000,00010110,

红包算法思考和总结 -- by jason.zhi

≯℡__Kan透↙ 提交于 2020-01-18 03:21:15
参考: http://mp.weixin.qq.com/s?__biz=MzI2NjA3NTc4Ng==&mid=402360599&idx=1&sn=69318b235e0e8b402d6fc566a3355af4&scene=0#wechat_redirect 进入知乎《微信红包的随机算法是怎样实现的》查看更多人的算法。 最近看到抢红包这么火,早就想尝试去把抢红包的功能试着去做一做了。刚好今天看到参考的网址,就产生了这一篇总结性的文章了。 我的早期逻辑猜想? 发红包者在发红包的时候,内存中存放的是红包的总额和红包的个数。然后在用户点击“拆红包”的时候,向服务器接口请求,服务器逻辑给用户计算出一个随机值(红包多少钱?),返回给前端。依次类推。 每次计算随机值时,都是用剩余的钱数除剩余拆红包的人,得出一个平均值,利用这个平均值去平衡每一个抢红包的用户得到的钱。 并没有第三,谢谢。 不过,看完参考的文章,思路还是有一定的改进的。在每个用户点击”拆红包”的时候,并没有像我想象中的那样去计算用户获得多少钱的红包,而是在发红包的时候(就是输入总额和红包个数,付款后并提交到服务器的时候),服务器就已经计算出每个红包的额度并存放到内存中了。那么当每个用户点击”拆红包”的时候,服务器直接就把”结果”(红包的数值)给前端就完成了一次领红包的操作了。从性能上看,这种方法明显优于我之前的想法,但是

常见排序算法实现

萝らか妹 提交于 2020-01-18 01:55:46
#include "pch.h" #include <iostream> #include<algorithm> #include<cmath> using namespace std; //选择排序 void selectSort(int arr[], int n) { for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { if (arr[j] < arr[i]) { swap(arr[j], arr[i]); } } } } //插入排序 void insertSort(int arr[], int n) { for (int i = 1; i < n; i++) { for (int j = i; j >=0; j--) { if (arr[j] < arr[j - 1]) { swap(arr[j], arr[j - 1]); } else break; } } } //改进的插入排序 void new_insertSort(int arr[], int n) { for (int i = 1; i < n; i++) { int j; int tmp = arr[i]; for (j = i; j >= 0; j--) { if (tmp < arr[j - 1]) { arr[j] = arr[j

策略模式

和自甴很熟 提交于 2020-01-18 01:16:45
个人博客 http://www.milovetingting.cn 策略模式 模式介绍 实现某一个功能有多种算法或者策略,可以根据实际情况选择不同的算法或者策略来实现该功能,如果将这些算法或者策略抽象出来,提供一个统一的接口,不同的算法或策略有不同的实现类,这样在程序客户端就可以通过注入不同的实现对象来实现算法或者策略的动态替换,这种模式的可扩展性,可维护性更高。这就是策略模式。 模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,使他们可以相互替换。策略模式让算法独立于使用它的客户而独立变化。 使用场景 针对同一类型问题的多种处理方式,仅仅是具体行为有差别时 需要安全地封装多种同一类型的操作时 出现同一抽象类有多个子类,而又需要使用if-else或者switch-case来选择具体子类时。 定义策略接口类 public interface Strategy { int calc ( ) ; } 定义具体的策略实现类 public class Strategy1 implements Strategy { @Override public int calc ( ) { System . out . println ( "Strategy1" ) ; return 1 ; } } public class Strategy2 implements Strategy {