文章分类 -  Algorithms

数据结构基础算法
摘要:SSE是Streaming SIMD Extensions的缩写,SIMD是Single Instruction Multiple Data的缩写,即对多条数据并行执行相同的操作,以提高CPU的性能。 从SSE4.1开始支持向量的内积:__m128 _mm_dp_ps( __m128 a,__m12 阅读全文
posted @ 2018-01-14 21:57 张朝阳 阅读(2332) 评论(1) 推荐(0) 编辑
摘要:n阶线性方程组 系统矩阵A非奇异,且aii≠0。则 于是雅可比迭代法就有了: 高斯-赛德尔迭代比雅可比迭代收敛性更好,应为它在计算xim+1时利用了已经计算出来的xi-1m+1 …… x1m+1。 阅读全文
posted @ 2017-07-05 13:48 张朝阳 阅读(3582) 评论(0) 推荐(1) 编辑
摘要:本文主要围绕scipy中的稀疏矩阵展开,也会介绍几种scipy之外的稀疏矩阵的存储方式。 dok_matrix 继承自dict,key是(row,col)构成的二元组,value是非0元素。 优点: 缺点: 适用场景: coo_matrix 如上图,构造coo_matrix需要3个等长的数组,val 阅读全文
posted @ 2016-05-11 20:41 张朝阳 阅读(9428) 评论(0) 推荐(1) 编辑
摘要:1 #!/usr/bin/env python 2 # coding=utf-8 3 4 ''' 5 蓄水池抽样法。从不知道总数的样本中随机抽取k个,要求只遍历一次样本。 6 ''' 7 8 import sys 9 import random10 11 if __name__ == '__m... 阅读全文
posted @ 2015-11-01 16:13 张朝阳 阅读(550) 评论(0) 推荐(0) 编辑
摘要:拉勾网上一个求职的兴趣有3个,感兴趣程度分别是{人事:0.6,行政:0.3,运营:0.1}求职者在拉勾APP首页每次下拉会多出5个推荐职位,我们希望总体上推荐职位的类型分布和该求职者的兴趣分布是一致的,问每次推荐的5个职位中“人事、行政、运营”类的职位分别应该出多少个?第1次:人事类出5*0.6=3... 阅读全文
posted @ 2015-09-27 17:10 张朝阳 阅读(961) 评论(0) 推荐(0) 编辑
摘要:Trie树主要应用在信息检索领域,非常高效。今天我们讲Double Array Trie,请先把Trie树忘掉,把信息检索忘掉,我们来讲一个确定有限自动机(deterministic finite automaton ,DFA)的故事。所谓“确定有限自动机”是指给定一个状态和一个变量时,它能跳转到的 阅读全文
posted @ 2015-05-24 15:03 张朝阳 阅读(12634) 评论(3) 推荐(3) 编辑
摘要:两个很大的整数--超过了INT_MAX,它们怎么做加法呢?把它们当作字符串,逐位进行相加喽。#include<stdio.h>#include<string.h>#include<stdlib.h>char* add(const char *arr,const char *brr){ int lena=strlen(arr); int lenb=strlen(brr); int maxlen=(lena<lenb)?lenb:lena; char* sum=(char*)malloc(maxlen+2); memset(sum,'0', 阅读全文
posted @ 2012-10-17 10:10 张朝阳 阅读(5395) 评论(2) 推荐(1) 编辑
摘要:Catalan Number满足下列递推公式:N个元素元素进栈,多少种出栈方式考虑A、B、C、D依次进栈,那么所有的出栈顺序是下列4种情况的并集:1)A第一个出栈。肯定是A进栈后马上出栈,剩下B、C、D的出栈顺序有h(3)种。h(0)*h(3)。2)A第二个出栈。在A之前出栈的肯定是B,B的出栈顺序有h(1)种,剩下C、D的出栈顺序有h(2)种。h(1)*h(2)。3)A第三个出栈。在A之前出栈的肯定是B、C,B、C的出栈顺序有h(2)种,剩下D的出栈顺序有h(1)种。h(2)*h(1)。4)A第四个出栈。在A之前出栈的肯定是B、C、D,B、C、D的出栈顺序有h(3)种。h(3)*h(0)。h 阅读全文
posted @ 2012-10-06 21:08 张朝阳 阅读(1547) 评论(0) 推荐(1) 编辑
摘要:回溯算法的求解过程实质上是一个先序遍历一棵"状态树"的过程,只是这棵树不是遍历前预先建立的,而是隐含在遍历过程中。幂集即求一个集合的所有子集。比如对于集合A={1,2,3},则A的幂集为p(A)={{1,2,3},{1,2},{1,3},{1},{2,3},{2},{3},Φ}求幂集P(A)的元素的过程可看成是依次对集合A中元素进行“取”或“舍”的过程,并且可以用一棵状态树来表示。求幂集元素的过程即为先序遍历这棵状态树的过程。每个节点都是一个一维数组。这个问题中不存在剪枝,所有状态都是合法的。#include<vector>#include<iostrea 阅读全文
posted @ 2012-09-08 20:08 张朝阳 阅读(2488) 评论(0) 推荐(0) 编辑
摘要:分(divide):递归解决较小的问题治(conquer):从子问题的解构建原问题的解一般认为正文中至少含有两个递归调用才叫分治,只包含一个递归的不叫分治。一般认为子问题是不相交的。方程的解为:整数相乘求两个N位数X和Y的乘积,手算需要进行次乘法,即把两个个位数相乘看作基本操作的话,算法复杂度为。X=12345678,Y=87654321,求XY。XL=1234,XR=5678,YL=8765,YR=4321。X=XL104+XR,Y=YL104+YR所以:需要进行4次4位数的乘法,乘以108只是一些补0操作,再加上几次加法构成了。由(1)式得,此时算法没有得到改进。注意到,所以在计算出后,只 阅读全文
posted @ 2012-09-07 19:12 张朝阳 阅读(1519) 评论(2) 推荐(0) 编辑
摘要:可变长度的整型定义:最高位表示是否还有字节要读取,低七位就是就是具体的有效位,添加到结果数据中。比如00000001 最高位表示0,那么说明这个数就是一个字节表示,有效位是后面的七位0000001,值为1。10000010 00000001 第一个字节最高位为1,表示后面还有字节,第二个字节最高位0表示到此为止了,即就是两个字节。注意低位在前,高位在后。所以“10000010 00000001”去年符号位后是“00000010 00000001”。高位是“00000001”,表示128,低位是“00000010”,表示2。所以整个数表示130。int num=0xffffffff; //nu. 阅读全文
posted @ 2012-09-04 20:23 张朝阳 阅读(1332) 评论(0) 推荐(0) 编辑
摘要:首先引出计算几何学中一个最基本的问题:如何判断向量在的顺时针方向还是逆时针方向?把p0定为原点,p1的坐标是(x1,y1),p2的坐标是(x2,y2)。向量的叉积(cross product)实际上就是矩阵的行列式:当叉积为正时,说明在的顺时针方向上;叉积为0说明两向量共线(同向或反向)。当同时满足:(1)和在的两侧(即一个顺时针方向上,一个在逆时针方向上)(2)和在的两侧时可肯定和相交。 图1图1是线段相交的一般情形。图2只满足第(1)条,不满足第(2)条所以不能证明和相交。 图2图3和图4是一种特殊情况,它不满足第(2)条,因为和重合,即和的叉积... 阅读全文
posted @ 2012-09-03 15:30 张朝阳 阅读(17405) 评论(2) 推荐(2) 编辑
摘要:Horner Rule是一种对多项求值的高效方法。直接计算的话,需要进行的乘法次数为:1+2+3+......+n,Horner给出的算法:需要进行的乘法次数为:N次#include<iostream>#include<deque>using namespace std;double horner(deque<double> & coe,double x,double pre=0.0){ if(coe.size()<=0) return pre; double rect=pre*x+coe.back(); coe.pop_back(); ret 阅读全文
posted @ 2012-09-03 09:13 张朝阳 阅读(2865) 评论(0) 推荐(0) 编辑
摘要:malloc/free和new/delete的区别malloc/free是C语言的标准库函数,new/delete是C++的运算符。 由于malloc/free是库函数而不是运算符,不在编译器控制权限之内。对于用户自定义的对象而言,用maloc/free无法满足动态管理对象的要求。(废话) new是 阅读全文
posted @ 2012-08-30 21:12 张朝阳 阅读(2602) 评论(1) 推荐(3) 编辑
摘要:首先给出一个对字符串比较好的散列函数,在有些地方把该算法称为“均匀哈希算法”。//提供一个对string进行散列的函数int hashString(const string &str){ string s; if(str.size()>1024) //如果str太长,则只取前1024个字符 s=str.substr(0,1024); else s=str; int rect=0; for(int i=0;i<s.size();++i) rect=rect*37+s[i]; //Horner法则 return rect;}这个散列函数可能会溢出,导致返回值为负数。注意这里选择 阅读全文
posted @ 2012-08-09 23:23 张朝阳 阅读(3347) 评论(2) 推荐(0) 编辑
摘要:如果不要求“原地”,正向遍历原链表,头插法建立一个新的单向链表,它就是原链表的逆序。下面利用递归的方法将单向链表原地逆序。#include<stdio.h>#include<stdlib.h>#include<string.h>typedef struct node{ int data; struct node *next;}NODE;void insert(NODE **head,NODE *node){ if((*head)==NULL){ *head=node; (*head)->next=NULL; }else{ //头... 阅读全文
posted @ 2012-06-09 17:49 张朝阳 阅读(4359) 评论(0) 推荐(0) 编辑
摘要:先提供几个链接PairingHeap算法讲得不错PairingHeap的C语言实现BinaryHeap, FibHeap, PairHeap对改进Dijkstra的性能比较Dijkstra的计算过程就是在维护一张表,形如:vknowndpv1T00v2F2v1v3F3v4v4T1v1v5F3v4v6F9v4v7F5v4每一次循环要从d中找出最小者,于是PairHeap、FibHeap、BinaryHeap等等就派上用场了。本文我们采用PariHeap,至于为什么请看链接3。当需要更改(减小)d的值时,需要从PairHeap上找到相应的节点再执行DecreaseKey操作,于是我在链接2的基础之 阅读全文
posted @ 2012-02-24 16:03 张朝阳 阅读(2246) 评论(0) 推荐(0) 编辑
摘要:AVL-tree、RB-tree、AA-tree均可以实现平衡的二叉查找树,虽然相对于一般的二叉搜索树其插入、删除节点的平均时间会比较长,但它们可以避免极验证应付的最坏的情况--树高度不平衡。 平衡二叉查找树所谓的平衡并不是绝对的平衡,而是要求任何一个节点的左右子树高度相差不会超过1,此时仍能够保证 阅读全文
posted @ 2011-12-06 12:08 张朝阳 阅读(7743) 评论(0) 推荐(1) 编辑
摘要:deque相对于vector的两大特点:可在常数时间内对首尾进行插入、删除操作。没有capacity(),不需要reserce(size_type n)。这是因为deque由动态分配的连续空间组合而成,随时可以增加一段新的空间链接起来。它没有必要像vector那样“因旧空间不足而重新分配2倍的空间,然后复制元素,再释放旧空间”。虽然deque也提供随机访问迭代器,但其复杂度不能和vector同日而语,这当然影响了各个运算层面。为提高效率,对deque进行排序时,可先将deque拷贝到vector中,再使用STL的sort算法,最后再复制回deque。deque是由一段一段的定量连续空间构成。一 阅读全文
posted @ 2011-12-06 09:17 张朝阳 阅读(3985) 评论(0) 推荐(1) 编辑
摘要:f(n)=f(n-1)+f(n-2)直接使用递归计算:#include<iostream>using namespace std;int count=0; //记录fibo函数调用的次数int fibo(int n){ count++; if(n==0 || n==1){ return 1; }else{ return fibo(n-1)+fibo(n-2); }}int main(){ int n=24; cout<<fibo(n)<<endl; cout<<"fibo函数被调用了"<<count<< 阅读全文
posted @ 2011-11-18 10:34 张朝阳 阅读(495) 评论(0) 推荐(0) 编辑