数据结构与算法
文章平均质量分 76
in_han
这个作者很懒,什么都没留下…
展开
-
常用算法经典代码
一、快速排序二、冒泡排序三、桶排序四、归并排序原创 2013-04-02 11:08:33 · 497 阅读 · 0 评论 -
洗牌程序
一、基本思路及证明:基本思路是:先初始化数字序列,然后为每个位置依次生成一个与之交换的随机位置,如果生成的随机位置不是它本身就执行交换操作。最早提出这个洗牌方法的是 Ronald A. Fisher 和 Frank Yates,即 Fisher–Yates Shuffle,其基本思想就是从原始数组中随机取一个之前没取过的数字到新的数组中,具体如下:1. 初始化数组,按序(升序或原创 2013-09-22 16:46:26 · 651 阅读 · 0 评论 -
求最小绝对值子串、一个整数数组求两两之差绝对值最小值
1. 求最小绝对值子串1) 暴力求解O(n^2)2) ...2.求整数数组两两之差绝对值最小值(不要求求出具体哪两个整数)1) 暴力求解 或 对相邻元素作差从而转化为 问题1: b1= a2-a1, b2=a3-a2, b3=a4-a3 ===>b2+b3 = a4-a2, ... 2) 先排序,再求相邻元素的差。原创 2013-09-17 23:32:46 · 909 阅读 · 0 评论 -
设计一种数据结构,使得取中位数的时间复杂度在 O(1)
设计一种数据结构,使得取中位数的时间复杂度在 O(1), 元素插入时间复杂度为log(n):1. 可以建造一棵二叉排序树, 保证 node_num( root->left )-node_num( root->right ) == 0 或 -1. 重点是保证二叉树的平衡 及 深度为log(n)。 此方法待验证.2. 可以考虑使用最大堆、最小堆: 中位数mid单独存原创 2013-09-18 16:26:07 · 3127 阅读 · 0 评论 -
两个数组元素(相加、相乘)相关的问题
1.两个数组两个元素之和的最小K个值: 要求复杂度低于O(n^2).已知A B两个数组,元素有序,构造新的集合S={x+y | x属于A, y属于B}求S中最小的k个元素,最优解法。2.两个数组(正数)两个元素之积的最小K个值: 已知A B两个数组,元素有序,构造新的集合S={x*y | x属于A, y属于B} 求S中最小的k个元素,最优解法。原创 2013-09-18 16:09:00 · 6102 阅读 · 0 评论 -
基础问题[ 快速排序 ]、[ 归并排序 ]
1. 快速排序:快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。该方法的基本思想是:1.先从数列中取出一个数作为基准数。2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。3.再对左右区间重复第二步,直到各区间只有一个数。代码如下:原创 2013-09-18 00:15:39 · 586 阅读 · 0 评论 -
最长公共了序列、最长公共子串
1. 最长公共了序列( LCS )问题 用 lcs( i, j ) 表示 X[ 1...i ] 与 Y[ 1...j ] 的最长公共子序列长度。 则: lcs( i, j ) = 1) i == 0 or j == 0 : lcs(i, j) = 0. 2) 若 X[ i ] == Y[ j ] : lcs( i, j ) = lcs(原创 2013-09-16 23:41:38 · 632 阅读 · 0 评论 -
Range Minimum Query( RMQ )
RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j方法一:蛮力搜索,时间时间复杂度 O( n )。方法二:O(N^2), O(1)利用动态规划进行预处理,计算出M:M[ i ][ j-1 ] 为 i 到 j-1 最小值索引,则M[i][j] = A[j] 方法三:O(NlogN), O(原创 2013-09-10 00:50:38 · 592 阅读 · 0 评论 -
线段树的应用
定义线段树在区间[i, j] 上如下: 第一个节点维护着区间 [i, j] 的信息。 if i应用范围:对一个区间整体进行操作,如寻找最大(小)值,整体加线段树有如下应用:1. Range Minimum Query( RMQ )问题: 参见:http://blog.csdn.net/in_han/article/details/11493原创 2013-09-10 22:55:33 · 779 阅读 · 0 评论 -
后缀数组
参考:后缀数组就是将字符串所有后缀排序后的数组,设字符串为S,令后缀Suffix(i)表示S[i..len(S)]。用两个数组记录所有后缀的排序结果:Rank[i]记录Suffix(i)排序后的序号,即Suffix[i]在所有后缀中是第Rank[i]小的后缀SA[i]记录第i位后缀的首字母位置,即Suffix[SA[i]]在所有后缀中是第i小的后缀然后就是怎么快原创 2013-09-09 20:16:29 · 520 阅读 · 0 评论 -
常见面试题合集
1. N对括号的所有合法排列题目:给定N对括号,输出其所有的合法的组合状态,例如,N=3,所有的合法状态为:"((()))”, “(()())”, “(())()”, “()(())”, “()()()”解法1, DFS: 在每个indx位置,分别进行扩展( 放入左括号 、 放入右括号),并且依据扩展的条件决定是否扩展。Python代码:#!/usr/bin/python#原创 2013-09-09 00:32:56 · 440 阅读 · 0 评论 -
分枝界限法
回溯法:求出解空间中满足约束条件的所有解。分支界限法:找出满足约束条件的一个解。搜索方式:回溯法使用深度优先的方式,而分支界限法使用广度优先或最小耗费的方式搜索解空间。1. 单源最短路径问题:问题描述:在有向图中,求出源顶点 s 到 目的顶点的最短路径。解决办法:使用优先队列式的分支界定法。算法描述: 1. 使用最小堆MinHeap来存储活结点列表原创 2013-09-07 16:46:05 · 1795 阅读 · 0 评论 -
Python实现 [堆] [堆排序]
用python的堆及堆排序:堆调整的两个方面(以最小堆说明):1. 删除堆顶元素:(自顶向下) 删除堆顶元素时,把最后一个节点 last_indx 移到堆顶, 将此节点称作cur。 当此cur元素的两个子节点元素中最小者大于其,则将其子节点最小者k与cur交换,并将k作为新的cur。再将cur与其两个子节点进行比较。直到cur两个子节点都比cur小 或者 cur 为原创 2013-09-08 02:12:42 · 785 阅读 · 0 评论 -
KMP
串的模式匹配算法:Index( S, T, pos ) 1. 常规算法:顺序比较,遇到不匹配的情况则回退。python 代码:(注意回退时回退步长)#!/usr/bin/python# -*- coding: utf-8 -*-# 算法:KMP# 传统算法, 返回template在 source中第pos个字符之后的位置def Index( source, t原创 2013-09-06 22:01:02 · 551 阅读 · 0 评论 -
python 树形结构
1. 使用dictionary 实现二叉排序树python 代码:#!/usr/bin/python# -*- coding: utf-8 -*-# python 二叉树def create_btree( e ): root = {"v":e[0], "left":None, "right":None} for i in e[1:-1]: inser原创 2013-09-07 10:15:30 · 2807 阅读 · 0 评论