算法

URL压缩算法的短地址

☆樱花仙子☆ 提交于 2020-03-04 01:31:30
时下,短网址应用已经在全国各大微博上開始流行了起来。比如QQ微博的url.cn,新郎的t.cn等。 我们在新浪微博上公布网址的时候。微博会自己主动判别网址。并将其转换,比如:http://t.cn/hrYnr0。 为什么要这样做的。原因我想有这样几点: 1、微博限制字数为140字一条,那么假设我们须要发一些连接上去,可是这个连接很的长,以至于将近要占用我们内容的一半篇幅,这肯定是不能被同意的,所以短网址应运而生了。 2、短网址能够在我们项目里能够非常好的对开放级URL进行管理。有一部分网址能够会涵盖性、暴力、广告等信息,这样我们能够通过用户的举报,全然管理这个连接将不出如今我们的应用中,应为相同的URL通过加密算法之后,得到的地址是一样的。 3、我们能够对一系列的网址进行流量。点击等统计。挖掘出大多数用户的关注点。这样有利于我们对项目的兴许工作更好的作出决策。 以上三点纯属个人观点,由于在我接下来的部分项目中会应用到。所以就了解了一下。以下先来看看短网址映射算法的理论(网上找到的资料): ① 将长网址用md5算法生成32位签名串,分为4段,,每段8个字符。 ② 对这4段循环处理,取每段的8个字符, 将他看成16进制字符串与0x3fffffff(30位1)的位与操作,超过30位的忽略处理; ③ 将每段得到的这30位又分成6段,每5位的数字作为字母表的索引取得特定字符

RSA 算法简述

末鹿安然 提交于 2020-03-04 00:36:55
RSA是什么 计算机的加密技术分为对称加密和非对称加密两类。在对称加密中,信息的加解密使用同一秘钥key,其可简化加解密的过程,较为简单,但不足之处在于由于加解密使用同一个key,信息传送双方都要接触这个key,密钥key更容易泄露。 在公开密钥加密即非对称加密中,密钥分为公钥PK(发送方通过PK对数据加密,然后发送给接收方,PK可公开),私钥SK(SK解密方保存,接收方通过SK对密文解密,SK不公开)。RSA公钥密码体制是最具代表性的非对称加密方式。 RSA算法原理 RSA定理:若P和Q是两个相异质数,另有正整数D和E,其中E的值与 (P-1)(Q-1)的值互质,并使得DE%(P-1)(Q-1)=1,有正整数M,且M<PQ,设: C=ME%PQ,B=CD%PQ,则有M=B。 生成公钥和密钥 随意选择两个大的素数P和Q,且P不等于Q 令N=PQ 令T=(P-1)(Q-1) 选择一个整数E,作为一个密钥,使E与T互质(即E与T的最大公约数为1),且E必须小于T 由公式DE%T=1,计算得到D的值,作为另一密钥 将(N,E)作为公钥,(N,D)作为私钥,当然也可互换。 用公钥加密信息 发送方收到公钥(N,E)后,通过公钥对数据进行加密,操作如下: 明文:M 加密:ME%N=C 密文:C 用私钥解密信息 接收方收到密文C后,通过私钥(N,D)进行解密,得到明文M,操作如下: 密文:C

hash

别等时光非礼了梦想. 提交于 2020-03-04 00:01:56
Hash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。 Hash算法可以将一个数据转换为一个标志,这个标志和源数据的每一个字节都有十分紧密的关系。Hash算法还具有一个特点,就是很难找到逆向规律。 Hash算法是一个广义的算法,也可以认为是一种思想,使用Hash算法可以提高存储空间的利用率,可以提高数据的查询效率,也可以做数字签名来保障数据传递的安全性。所以Hash算法被广泛地应用在互联网应用中。 [1] Hash算法也被称为散列算法,Hash算法虽然被称为算法,但实际上它更像是一种思想。Hash算法没有一个固定的公式,只要符合散列思想的算法都可以被称为是Hash算法。 常用HASH函数 散列函数能使对一个数据序列的访问过程更加迅速有效,通过散列函数,数据元素将被更快地定位。常用Hash函数有: 1.直接寻址法。取关键字或关键字的某个线性函数值为散列地址。即H(key)=key或H(key) = a·key + b,其中a和b为常数(这种散列函数叫做自身函数) 2. 数字分析法

扒一扒JVM的垃圾回收机制,下次面试你准备好了吗?

旧时模样 提交于 2020-03-03 23:41:46
一、 技术背景你要了解吧 二、 哪些内存需要回收? 2.1 引用计数算法 2.1.1 算法分析 2.1.2 优缺点 2.1.3 是不是很无趣,来段代码压压惊 2.2 可达性分析算法 2.3 Java中的引用你了解多少 2.4 对象死亡(被回收)前的最后一次挣扎 2.5 方法区如何判断是否需要回收 三、常用的垃圾收集算法 3.1 标记-清除算法 3.2 复制算法 3.3 标记-整理算法 3.4 分代收集算法 3.4.1 年轻代(Young Generation)的回收算法 3.4.2 年老代(Old Generation)的回收算法 3.4.3 持久代(Permanent Generation)的回收算法 四、常见的垃圾收集器 五、GC是什么时候触发的(面试最常见的问题之一) 5.1 Scavenge GC 5.2 Full GC 结束语 一、 技术背景你要了解吧   按照套路是要先装装X,谈谈JVM垃圾回收的前世今生的。说起垃圾回收(GC),大部分人都把这项技术当做Java语言的伴生产物。事实上,GC的历史比Java久远,早在1960年Lisp这门语言中就使用了内存动态分配和垃圾回收技术。设计和优化C++这门语言的专家们要长点心啦~~ 二、 哪些内存需要回收?   猿们都知道JVM的内存结构包括五大区域:程序计数器、虚拟机栈、本地方法栈、堆区、方法区。其中程序计数器、虚拟机栈

自己实现文本相似度算法(余弦定理)

喜你入骨 提交于 2020-03-03 23:28:36
最近由于工作项目,需要判断两个txt文本是否相似,于是开始在网上找资料研究,因为在程序中会把文本转换成String再做比较,所以最开始找到了这篇关于 距离编辑算法 Blog写的非常好,受益匪浅。 于是我决定把它用到项目中,来判断两个文本的相似度。但后来实际操作发现有一些问题:直接说就是查询一本书中的相似章节花了我7、8分钟;这是我不能接受…… 于是停下来仔细分析发现,这种算法在此项目中不是特别适用,由于要判断一本书中是否有相同章节,所以每两个章节之间都要比较,若一本书书有x章的话,这里需对比x(x-1)/2次;而此算法采用矩阵的方式,计算两个字符串之间的变化步骤,会遍历两个文本中的每一个字符两两比较,可以推断出时间复杂度至少为 document1.length × document2.length ,我所比较的章节字数平均在几千~一万字;这样计算实在要了老命。 想到Lucene中的评分机制,也是算一个相似度的问题,不过它采用的是计算向量间的夹角(余弦公式),在google黑板报中的: 数学之美(余弦定理和新闻分类) 也有说明,可以通过余弦定理来判断相似度;于是决定自己动手试试。 首相选择向量的模型:在以字为向量还是以词为向量的问题上,纠结了一会;后来还是觉得用字,虽然词更为准确,但分词却需要增加额外的复杂度,并且此项目要求速度,准确率可以放低,于是还是选择字为向量。

[算法]合并两个有序的单链表

一世执手 提交于 2020-03-03 22:54:41
题目: 给定两个有序单链表的头结点head1和head2.请合并两个有序链表,合并后的链表依然有序,并返回合并后的链表的头结点。 例如: 0->2->3->7->null; 1->3->5->7->9->null; 合并后的链表为:0->1->2->3->3->5->7->7->9->null。 程序: public static Node merge(Node head1,Node head2){ if (head1==null||head2==null) { return head1=head2==null?head2:head1; } Node head=head1.value<head2.value?head1:head2; Node cur1=head1.value<head2.value?head1:head2; Node cur2=head1.value>head2.value?head1:head2; Node pre=cur1; Node next=cur1.next; while(cur1!=null&&cur2!=null){ if (cur1.value<=cur2.value) { pre=cur1; cur1=cur1.next; }else{ next=cur2.next; pre.next=cur2; cur2.next=cur1; pre=cur2

Java基础算法,搜索数据位置

匆匆过客 提交于 2020-03-03 19:26:23
分析:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。可以根据二分法查找进行解题 public static int search(int arr[], int find) { //声明变量存数组最小索引和最大索引及中间索引(二分法) int max = arr.length - 1; int min = 0; int mid = (max + min)/2; while (min <= max) { if (find > arr[mid]) {//如果要找的数大于中间索引 min = mid + 1; mid=(min+max)/2; } else if(find < arr[mid]) {//如果要找的数小于中间索引 max = mid - 1; mid=(min+max)/2; } else { return mid;//找到了目标下标 } } return min;//没找到则返回其位置最小的下标,即为它按顺序插入的位置 } 来源: CSDN 作者: 澄明_cmit888 链接: https://blog.csdn.net/weixin_46175424/article/details/104631781

P3805 【模板】manacher算法

非 Y 不嫁゛ 提交于 2020-03-03 17:14:43
https://www.luogu.com.cn/problem/P3805 #include <bits/stdc++.h> using namespace std; const int maxn = 1e7 + 1e6 + 5; char s[maxn * 2], str[maxn * 2]; int Len[maxn * 2], len; void getstr() {//重定义字符串 int k = 0; str[k++] = '@';//开头加个特殊字符防止越界 for (int i = 0; i < len; i++) { str[k++] = '#'; str[k++] = s[i]; } str[k++] = '#'; len = k; str[k] = 0;//字符串尾设置为0,防止越界 } int manacher() { int mx = 0, id;//mx为最右边,id为中心点 int maxx = 0; for (int i = 1; i < len; i++) { if (mx > i) Len[i] = min(mx - i, Len[2 * id - i]);//判断当前点超没超过mx else Len[i] = 1;//超过了就让他等于1,之后再进行查找 while (str[i + Len[i]] == str[i - Len[i]]) Len

k-近邻算法

早过忘川 提交于 2020-03-03 15:51:52
过程 K-近邻算法的具体思想如下: (1)计算已知类别数据集中的点与当前点之间的距离 (2)按照距离递增次序排序 (3)选取与当前点距离最小的k个点 (4)确定前k个点所在类别的出现频率 (5)返回前k个点中出现频率最高的类别作为当前点的预测分类 1.创建数据集 def createDataSet ( ) : group = array ( [ [ 1.0 , 1.1 ] , [ 1.0 , 1.0 ] , [ 0 , 0 ] , [ 0 , 0.1 ] ] ) labels = [ 'A' , 'A' , 'B' , 'B' ] return group , labels 2.k-近邻算法 def classify0 ( inX , dataSet , labels , k ) : dataSetSize = dataSet . shape [ 0 ] diffMat = tile ( inX , ( dataSetSize , 1 ) ) - dataSet sqDiffMar = diffMat ** 2 sqDistance = sqDiffMar . sum ( axis = 1 ) distance = sqDistance ** 0.5 sortedDist = distance . argsort ( ) classCount = { } for i in

面试算法(一)

为君一笑 提交于 2020-03-03 15:47:12
写一个类似 printf 的可以接受任意类型,任意个数的打印函数 # include <iostream> void show_list ( ) { } //递归的终止条件,args 为 0 template < typename T > //单独处理最后一个参数,换行而不是 , void show_list ( const T & value ) { std :: cout << value << std :: endl ; } template < typename T , typename . . . Args > void show_list ( const T & value , const Args & . . . args ) { std :: cout << value << "," ; show_list ( args . . . ) ; } int main ( ) { int n = 19 ; std :: string s = "kjfdh" ; double f = 1.11123 ; show_list ( n , f , s ) ; return 0 ; } 问:用预处理指令计算一年有多少秒 # include <iostream> # define Year_Second (365UL*24*3600UL) using namespace std ;