算法

leetcode算法题01

时间秒杀一切 提交于 2020-01-03 04:43:58
最近求职需要重新刷算法题,从今天开始每天至少做一个leatcode的题 如果有更好的算法或者换了语言也会更新 题目: 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 解法 : 官方给了三种解法: 是暴力循环,想的简单,易于理解,但是如果数组里元素很多的话就很卡,复杂度分析: 时间复杂度:O(n^2) ), 对于每个元素,我们试图通过遍历数组的其余部分来寻找它所对应的目标元素,这将耗费 O(n) 的时间。因此时间复杂度为 O(n^2)。 空间复杂度:O(1)。 是用哈希表循环两遍,第一遍是录入哈希表,第二遍再循环找一遍, 复杂度分析: 时间复杂度:O(n), 我们把包含有 nn 个元素的列表遍历两次。由于哈希表将查找时间缩短到 O(1),所以时间复杂度为 O(n)。 空间复杂度:O(n), 所需的额外空间取决于哈希表中存储的元素数量,该表中存储了 n个元素。 是用哈希表循环一遍,在第一遍时一边录入一边排查,之前面试也碰到过这道题,当时面试官给的解法就是这种,相对理想 复杂度分析 : 时间复杂度:O(n), 我们只遍历了包含有 nn

由二分查找算法学习算法的时间复杂度

醉酒当歌 提交于 2020-01-02 23:57:43
二分查找 二分查找是一种算法,其输入是一个 有序 的元素列表和要查找的元素。如果要查找的元素包含在列表中,二分查找返回其位置;否则返回null。 数据 函数形参:列表: xlist ,要查找的值: item 查找范围的索引: low ~ high 要去的索引: mid ,猜测的值: guess 算法 跟踪要查找的列表部分——开始时为整个列表 每次都检查中间的元素 xlist[mid] 如果猜的数字小了,就相应地修改 low , 如果猜的数字大了,就修改 high , 猜对了返回 mid ,否则列表 xlist 里没有要查找的值 iem ,返回 None 函数代码 def binsearch ( xlist , y ) : #注意list不能直接做形参 low = 0 high = len ( xlist ) - 1 while low <= high : mid = ( low + high ) / 2 mid = round ( mid ) #一定要取整 guess = xlist [ mid ] if guess == y : return mid if guess > y : high = mid - 1 else : low = mid + 1 return None 调用函数 import sys sys . path . append ( r "D:\python

以图搜图技术与simhash算法.md

旧时模样 提交于 2020-01-02 23:21:37
背景 以图搜图是很有颠覆力的应用,俗话说 一图胜千言 不同于文本搜索的匹配模式,以图搜图要对搜索的信息源进行处理,抽取特征信息。在网易存证系统的开发过程中调研了用于以图搜图的 simhash 算法,并设想在内容系统建设完善后可以用于诸多的场景,比如: 商业图片侵权自动取证 肖像内容的识别 家庭照片按场景自动分类 图片指纹比较 simhash算法 阮一峰博客 相似图片搜索的原理 压缩大小 压缩颜色 计算平均灰度值 每个像素和平均值比较,大的为1;小的为0, 进一步向量化 得出向量,就是图片指纹, 计算汉明距离 hamming distance 如上过程的java实现 通过如上粗粒度的算法分析,可知simhash和普通hash算法有较大不同;普通hash算法是对字节流无差别的处理,但是simhash首先会对信息抽取特征值,然后计算汉明距离,最后这步是关键,度量了两个特征量的相似性,让我们有可能在抓取了两张图片的关键特征的基础上,比较其相似性。 动手实验 普通hash是差一个空格,也相差极大,比如如下(差别就是一个是 喊 ,一个是 叫 ): vincent@vincent-B250M-DS3H:~$ cat > 1.txt 你妈妈喊你回家吃饭,回家罗回家罗 vincent@vincent-B250M-DS3H:~$ cat > 2.txt 你妈妈叫你回家吃饭,回家罗回家罗 然后,cat

【算法学习】最小生成树

只愿长相守 提交于 2020-01-02 19:24:16
最小生成树 最小生成树的算法包括Prim算法和Kruskal算法。 在用Kruscal算法的时候会用到并查集。 完整代码可直接翻到最后~ 首先咱们先介绍比较容易理解也是最先会想到的一个算法,Prim算法。 Prim Prim算法的时间复杂度为O(n^2)。 Prim算法的思想就是从图中任意一点选择为始点,然后开始搜索可以从这个点到达其他点的最短距离。其实这个思想和Dijstra算法很相似。 不同之处在于,Dijstra算法计算的是点到点最短距离,Prim算法是把所有点连通起来权值最小。 实质上也就是,Dijstra算法在把某个点加入到集合中时,它的算法仅仅只是把这个点当做一个跳板,内部点与点之间还是存在距离(得到了某个人却没有得到它的心)。而Prim算法则是把这个点合在了一起,也就是在加入某个点之后,就可以把这些点看成一个点,集合内部没有距离(得到某个人并且得到了它的心)。 看例子(从0开始): 用Dijstra算法 首先0,然后0->1, 最后0->2。 用Prim算法 首先0,然后0->1,最后1->2。 所以这两个算法的区别就是在于0->1这个距离在后续中考虑存在与否。更一般的就是被添加到集合中的点与点之间的距离是否还存在。 好的,请看算法核心代码 void Primnew () { int V[N]; //V[] 记录节点的前驱 int dis[N];/

常用消息摘要算法介绍

a 夏天 提交于 2020-01-02 09:04:50
消息摘要算法 介绍: 数据摘要算法是密码学算法中非常重要的一个分支,它通过对所有数据提取指纹信息以实现数据签名、数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密。数据摘要算法也被称为哈希(Hash)算法或散列算法。 消息摘要算法的主要特征是加密过程不需要密钥,并且经过加密的数据无法被解密,只有输入相同的明文数据经过相同的消息摘要算法才能得到相同的密文。(摘要可以比方为指纹,消息摘要算法就是要得到文件的唯一职位) 特点: 无论输入的消息有多长,计算出来的消息摘要的长度总是固定的。 一般地,只要输入的消息不同,对其进行摘要以后产生的摘要消息也必不相同;但相同的输入必会产生相同的输出。 只能进行正向的信息摘要,而无法从摘要中恢复出任何的消息,甚至根本就找不到任何与原信息相关的信息(不可逆性)。 好的摘要算法,没有人能从中找到“碰撞”或者说极度难找到,虽然“碰撞”是肯定存在的(碰撞即不同的内容产生相同的摘要)。 应用: 一般地,把对一个信息的摘要称为该消息的指纹或数字签名。数字签名是保证信息的完整性和不可否认性的方法。数据的完整性是指信宿接收到的消息一定是信源发送的信息,而中间绝无任何更改;信息的不可否认性是指信源不能否认曾经发送过的信息。其实,通过数字签名还能实现对信源的身份识别(认证),即确定“信源”是否是信宿意定的通信伙伴。 数字签名应该具有唯一性

java 加密之消息摘要算法

雨燕双飞 提交于 2020-01-02 09:04:25
简介 消息摘要算法的主要特征是加密过程不需要密钥,并且经过加密的数据无法被解密,即单向加密,只有输入相同的明文数据经过相同的消息摘要算法才能得到相同的密文。 消息摘要算法不存在密钥的管理与分发问题,适合于分布式网络上使用。由于其加密计算的工作量相当巨大,所以以前的这种算法通常只用于数据量有限的情况下的加密,例如计算机的口令就是用不可逆加密算法加密的 用途 一般地,把对一个信息的摘要称为该消息的指纹或数字签名,数字签名是保证信息的完整性和不可否认性的方法。消息摘要算法适合作为数字签名算法,也是数字签名的核心算法。 分类 MD(Message Digest,消息摘要) SHA(Secure Hash Algorithm,安全散列算法) MAC(Message Authentication Code,消息认证码) …… MD MD算法包括MD2、MD4和MD5,摘要长度都是128位,都是单向加密,其中JDK自带MD2和MD5。 MD5的 java 实现 public class MyMD5 { public static void main(String[] args) { String str = "i am guo feng"; try { //获取MD5算法实例 MessageDigest md = MessageDigest.getInstance("MD5"); /

3.5星|《算法霸权》:AI、算法、大数据在美国的阴暗面

拜拜、爱过 提交于 2020-01-02 02:52:33
算法霸权 作者在华尔街对冲基金德绍集团担任过金融工程师,后来去银行做过风险分析,再后来去做旅游网站的用户分析。后来辞职专门揭露美国社会生活背后的各种算法的阴暗面。 书中提到的算法的技术缺陷,我归纳为两点:第一个比较致命:不准确。不准确有两种体现,首先是算法先天的问题,比如教师评估算法,针对大规模的学生来评估教学质量是可行的,但是具体到一个教师,每年只教30个学生,如果这30个学生中有一两个极好或极差的,会导致对教师的评估出现很大的波动。 算法不准确的第二种情况是得不到反馈因此没法逐步优化,作者举一些美国公司采用的招聘评估软件为例,及可能把一些不合格的员工派出在外了,但是雇主不关心,算法得不到反馈因此得不到改进的机会。 另外一大缺陷是不公开导致有效益但不公平。还是以招聘时候的评估算法为例,会把一些人拒绝,拒绝的原因有可能是跟罪犯同名之类的错误,更有可能是因为应聘者的种族、居住地等信息。 书中提到算法在加重美国的贫富分化。除了招聘评估算法外,预计犯罪地点的算法,实际只能预测轻度犯罪,这一类犯罪在贫民区更多,反过来会强化警察在贫民区的巡查,在贫民区抓获更多轻度犯罪者投入监狱。 美国的营利性大学(按书中描述跟国内的莆田系有一拼),靠算法帮助,把营销目标集中的穷人身上,让他们花相对高数倍的学费,得到的文凭在人才市场上跟高中文凭价值接近。 作者提出的改善措施是:自律、监管、公开

十大基础排序算法-scala编写

本秂侑毒 提交于 2020-01-01 21:39:45
十大基础排序算法-scala编写 1、前言 2、排序 2.1、排序分类 2.2、影响因素 3、冒泡排序 4、选择排序 5、插入排序 6、希尔排序 7、归并排序 8、快速排序 9、堆排序 10、计数排序 11、桶排序 12、基数排序 1、前言 最近补了一下《数据结构与算法》的相关知识,这里记录一下常见的十大排序算法。因为最近自己在学习 scala ,所以下面都是使用的 scala 进行编程,其与 java 语法有很多类似,保留了 java 的面向对象编程,同时拥有函数式编程。 (用什么语言都一样,算法思路对就行。) 2、排序 2.1、排序分类 根据在排序的过程中待排序的记录是否全部被放置在内存中,排序分为:内排序和外排序 其中,内排序是在排序的整个过程中,待排序的所有记录全部被放置在内存中。外排序是由于排序的次数个数太多,不能同时放置在内存中,整个排序过程需要在内外存之间多次交换数据才能进行。 根据内排序过程中借助的主要操作,我们把内排序分为:插入排序、交换排序、选择排序、归并排序。 常见的内排序有: 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 计数排序 桶排序 基数排序 2.2、影响因素 对于内排序来说,排序算法的性能主要是受3个方面影响: 时间性能 排序是数据处理中经常执行的一种操作,往往属于系统的核心部分,因此排序算法的时间开销是衡量其好坏的最重要的标志

推荐算法之基于物品的协同过滤

旧城冷巷雨未停 提交于 2020-01-01 12:25:21
基于物品的协同过滤( item-based collaborative filtering )算法是此前业界应用较多的算法。无论是亚马逊网,还是 Netflix 、 Hulu 、 YouTube ,其推荐算法的基础都是该算法。为行文方便,下文以英文简称 ItemCF 表示。本文将从其基础算法讲起,一步步进行改进并基于 MovieLens 数据集给出代码实现,带你领略这一经典算法的美。 1.基本原理 前面我们简单讲解了一下基于用户的协同过滤推荐(UserCF),并且给出了实现代码。还不了解的朋友可以转到链接---- 推荐算法之基于用户的协同过滤 。但是我们也讲到该算法存在一些缺点,首先,随着网站的用户数目越来越大,计算用户兴趣相似度矩阵将越来越困难,其运算时间复杂度和空间复杂度的增长和用户数的增长近似于平方关系。其次,基于用户的协同过滤很难对推荐结果作出解释。因此,著名的电子商务公司亚马逊提出了另一个算法——ItemCF 。 ItemCF 给用户推荐那些和他们之前喜欢的物品相似的物品。比如,该算法会因为你购买过《统计学习方法》而给你推荐《机器学习》。不过,ItemCF算法并 不利用物品的内容属性计算物品之间的相似度 ,它 主要通过分析用户的行为记录计算物品之间的相似度 。 该算法认为,物品 A 和物品 B 具有很大的相似度是因为喜欢物品 A 的用户大都也喜欢物品B 。

操作系统原理之磁盘调度

僤鯓⒐⒋嵵緔 提交于 2020-01-01 07:49:07
首先介绍主要的的四种磁头调度算法 (一)先来先服务算法(FCFS) 1、算法思想:按访问请求到达的先后次序服务。 2、优点:简单,公平。 3、缺点:效率不高,相邻两次请求可能会造成最内到最外的柱面寻道,使磁头反复移动,增加了服务时间,对机械也不利。 4、例子: 假设磁盘访问序列:98,183,37,122,14,124,65,67。读写头起始位置:53。求:磁头服务序列和磁头移动总距离(道数)。 由题意和先来先服务算法的思想,得到 下图所示的磁头移动轨迹。由此: 磁头服务序列为:98,183,37,122,14,124,65,67 磁头移动总距离=(98-53)+(183-98)+|37-183|+(122-37)+|14-122|+(124-14)+|65-124|+(67-65)=640(磁道) (二)最短寻道时间优先算法(SSTF) 1、算法思想:优先选择距当前磁头最近的访问请求进行服务,主要考虑寻道优先。 2、优点:改善了磁盘平均服务时间。 3、缺点:造成某些访问请求长期等待得不到服务。 4、例子:对上例的磁盘访问序列,可得磁头移动的轨迹 如下图。请同学自己给出磁头服务序列并计算磁头移动总距离。 (三) 扫描算法(电梯算法)(SCAN) 1、算法思想:当设备无访问请求时,磁头不动;当有访问请求时,磁头按一个方向移动,在移动过程中对遇到的访问请求进行服务