算法

紫薇星上的数据结构(10)

怎甘沉沦 提交于 2020-02-29 16:46:53
终于来到最后一部分了,算法,这篇文章的出现也意味着这个系列就结束了,向着最后的胜利冲冲冲! 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。 这一部分我们要整理的算法一般都是前人已经完善好的,大家如果不能理解其原理,那就学会如何使用就可以了。 简单来说算法就是解决特定问题的求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令都表示一个或者多个操作。这里要注意:同一个问题可能有多种不同的解决算法;没有一个通用算法可以解决所有问题。 一个算法应该具有以下 五个重要的特征 : 有穷性(Finiteness):算法的有穷性是指算法必须能在执行有限个步骤之后终止; 确切性(Definiteness):算法的每一步骤必须有确切的定义; 输入项(Input):一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件; 输出项(Output):一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的; 可行性

十大排序算法基础1

偶尔善良 提交于 2020-02-29 15:27:20
学习链接: https://www.cnblogs.com/onepixel/p/7674659.html 1. 排序算法的分类 2. 排序算法的复杂度 3.相关概念 稳定 :如果a原本在b前面,而a=b,排序之后a仍然在b的前面。 不稳定 :如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。 时间复杂度 :对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。 空间复杂度 :是指算法在计算机内执行时所需存储空间的度量,它也是数据规模n的函数。 来源: CSDN 作者: 雨瑜 链接: https://blog.csdn.net/weixin_43584807/article/details/104570974

设计模式之策略模式

做~自己de王妃 提交于 2020-02-29 13:56:26
一、策略模式的概念 策略模式是一种行为模式,它通过对一系列的算法(或者行为)加以封装,并为这些算法(或者行为)定义统一的抽象算法(或者行为)接口, 具体子类继承该抽象算法(或者行为)接口对所有的算法(或者行为)加以封装和实现,调用者去自由的选择使用哪个算法(或者行为)。 二、策略模式使用场景 1、一个系统需要动态地在几种算法(或者行为)中选择一种时,可以使用策略模式。 2、当一个对象有很多的行为,为避免使用过多的条件判断语句,可以使用策略模式来实现。 三、策略模式构建方法 1、策略抽象类(Strategy) 策略抽象类给策略具体类提供统一的共同接口和方法。 2、策略具体类(ConcreteStrategy) 策略具体类继承策略抽象类,用于实现策略抽象父类中的共同接口和方法。 3、策略的容器类(Context) 策略的外部封装类, 根据不同的策略执行不同的行为。 四、策略模式的示例 // StrategyPattern.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // # include <iostream> # include <string> using namespace std ; # define DELETE_PTR(p) {if(p!=nullptr){delete (p); (p)=nullptr;}} // 策略算法基类 class

hash值和hash算法

隐身守侯 提交于 2020-02-29 13:50:11
hash值的作用 现在主流的还是base64编码,进行对字符串的编码。base64其实不是安全领域下的加密解密算法。虽然有时候经常看到所谓的base64加密解密。其实base64只能算是一个编码算法,对数据内容进行编码来适合传输。虽然base64编码过后原文也变成不能看到的字符格式,但是这种方式很初级,很简单。一般高级一点的程序员一眼就能看出来是不是用的base64进行编码,进而通过base64的解密,得出想要的结果。 所以使用hash值进行编码的转换,因为hash值是唯一的,不可逆的!但是通过hash编码却是可以的!二是因为hash值一串数字比较不容易辨别是不是hash值。 2.hash值 一般是把字符串或者byte[],当成一个数组进行遍历,然后转换为int类型的值。 hash主要用于信息安全领域中加密算法,它把一些不同长度的信息转化成杂乱的128位的编码,这些编码值叫做HASH值. 也可以说,hash就是找到一种数据内容和数据存放地址之间的映射关系。 3.hash值的计算算法 这个只是其中的一种算法: /** * 使用FNV1_32_HASH算法计算服务器的Hash值,这里不使用重写hashCode的方法,最终效果没区别 */ private static int getHash(String str) { final int p = 16777619; int hash =

数据结构与算法系列六(栈)

自作多情 提交于 2020-02-29 13:15:32
1.引子 1.1.为什么要学习数据结构与算法? 有人说,数据结构与算法,计算机网络,与操作系统都一样,脱离日常开发,除了面试这辈子可能都用不到呀! 有人说,我是做业务开发的,只要熟练API,熟练框架,熟练各种中间件,写的代码不也能“飞”起来吗? 于是问题来了:为什么还要学习数据结构与算法呢? #理由一: 面试的时候,千万不要被数据结构与算法拖了后腿 #理由二: 你真的愿意做一辈子CRUD Boy吗 #理由三: 不想写出开源框架,中间件的工程师,不是好厨子 1.2.如何系统化学习数据结构与算法? 我想好了,还是需要学习数据结构与算法。但是我有两个困惑: 1.如何着手学习呢? 2.有哪些内容要学习呢? 学习方法推荐: #学习方法 1.从基础开始,系统化学习 2.多动手,每一种数据结构与算法,都自己用代码实现出来 3.思路更重要:理解实现思想,不要背代码 4.与日常开发结合,对应应用场景 学习内容推荐: 数据结构与算法内容比较多,我们本着实用原则,学习经典的、常用的数据结构、与常用算法 #学习内容: 1.数据结构的定义 2.算法的定义 3.复杂度分析 4.常用数据结构 数组、链表、栈、队列 散列表、二叉树、堆 跳表、图 5.常用算法 递归、排序、二分查找 搜索、哈希、贪心、分治 动态规划、字符串匹配 2.考考你 你还记得在数组那一篇中,我们说过基于线性表的数据结构有哪些吗?它们是:数组

寻找最长公共前缀

时光怂恿深爱的人放手 提交于 2020-02-29 12:34:39
https://leetcode.com/problems/longest-common-prefix/ Write a function to find the longest common prefix string amongst an array of strings. 给定一个string数组,寻找公共的最长前缀; 假设给定数组 ab, ac, ad, 那么最长公共前缀为a 基本思路: 1. 切分出每个字符串的所有前缀,比如abc的前缀为, "", a, ab, abc; 2. 将这些前缀连接成一个新的前缀数组;对于给定的例子, 可以得到,["", a, ab, "", a, ac, "", a, ad]的前缀数组; 3. 那么公共的前缀的,其数量必然等于输入字符数组的总和n;比如 "" 肯定是一个公共前缀,那么在前缀数组总, 必然包含n个 ""; 接下来的问题是怎么找到最长的公共前缀; 最简单的方法先排序,然后依次扫描前缀, 并计数;直到找到一个计数少于n的前缀,那么前一个就是最长公共前缀; 但如果排过序了, 其实可以用二分查找的方式更快的找到答案;下面是二分查找的代码: package main import ( "fmt" "sort" ) func main() { strs := []string{"flower", "flow", "flight"} fmt

拔河比赛---C语言代码,编译器Xcode

回眸只為那壹抹淺笑 提交于 2020-02-29 09:25:57
拔河比赛 规矩把所有人分成A B两队,力气大的一方胜出 由于一开始不知道每个人力量多大,所以主持人分组定下如下策略: 根据每个人的体重尽可能的分配平均 分配的策略是: A B两队人数相差 <= 1 A B两队人总量之差绝对值最小 ======================================================= 比如某班级有N(可为奇数或者偶数)个人, 编号为0, 1, 2, ... (N-1) 每个人都有自身的体重, 比如 W0, W1, W2, ... W(N-1) 请问如何分配比赛两队的人数,保证双方人体重总和相差最小 打印出 A B两队的总体重(从小到大) 比如: 有7个人, 体重分别为 100 90 200 220 130 120 110 输出为(先输出体重小的两边总和): 470 500 请设计一个程序,根据人数自动来进行统计 注意输入的时候 第一个是输入的人个数,比如7个人后续输入的是7个人的体重 ================================================================== 思路: 1.这是个什么问题 求 的最小值 2.我的思路 把所有的可能都列出来,和所有人体重的一半相比,差绝对值最小的就是所要求的。 3如何实现我的思路 递归:n个里面选n (原始状态)<- (n + 1)个里面选n

《Effective STL》重读笔记整理

喜夏-厌秋 提交于 2020-02-29 06:12:14
最近有闲,在工作之余重读了《effective STL》一书,并通过 twitter 记了一下笔记,今天整理收集到这里。 twitter 真的非常适合记读书笔记,哈哈,以后要好好地发扬。另,我的手机还是很老的 UIQ 3.0 的索爱手机,有没有达人推荐一些上推的应用程序?谢谢。 ==================================== #estl 第50条:熟悉与STL相关的web站点。三个:www.sgi.com/tech/stl、www.stlport.org 和 www.boost.org。 #estl 第49条:学会分析与STL相关的编译器诊断信息。嗯,第一招是替换大法,然后介绍了一下与容器、插入迭代器、绑定器、输出迭代器或算法相关的错误大概有什么套路看。 #estl 第48条:总是包含(#include)正确 的头文件。因为C++标准没有规定头文件的互相包含关系,所以不同的STL实现有所不同。要记住容器基本上声明在同名文件中,算法是algo..和 num..,迭代器在iterator中,函数子和配接器在functional中。 #estl 第47条:避免产生“直写型”(write-only)的代码。即所谓容易编写,但难以阅读和理解的代码,比如一行调用函数12次,其中 10 个是互不相同的。 #estl 第46条

国密算法实现

天大地大妈咪最大 提交于 2020-02-29 04:56:53
国密算法实现 一、国产密码算法介绍 国产密码算法(国密算法)是指国家密码局认定的国产商用密码算法,在金融领域目前主要使用公开的SM2、SM3、SM4三类算法,分别是非对称算法、哈希算法和对称算法。 1.SM2算法:SM2 椭圆曲线公钥密码算法 是我国自主设计的 公钥密码算法 ,包括SM2-1椭圆曲线 数字签名 算法,SM2-2椭圆曲线 密钥交换 协议,SM2-3椭圆曲线公钥加密算法,分别用于实现数字签名密钥协商和数据加密等功能。SM2算法与RSA算法不同的是,SM2算法是基于椭圆曲线上点群离散对数难题,相对于RSA算法,256位的SM2密码强度已经比2048位的RSA密码强度要高。 椭圆曲线参数并没有给出推荐的曲线,曲线参数的产生需要利用一定的算法产生。但在实际使用中,国密局推荐使用素数域256 位椭圆曲线,其曲线方程为y^2= x^3+ax+b(其中p是大于3的一个大素数,n是基点G的阶,Gx、Gy 分别是基点G的x与y值,a、b是随圆曲线方程y^2= x^3+ax+b的系数)。 2.SM3算法:SM3 杂凑算法 是我国自主设计的密码杂凑算法,适用于商用密码应用中的数字签名和验证消息认证码的生成与验证以及随机数的生成,可满足多种密码应用的安全需求。为了保证杂凑算法的安全性,其产生的杂凑值的长度不应太短,例如MD5输出128比特杂凑值,输出长度太短,影响其安全性SHA