Basic - 算法/数据结构
文章平均质量分 88
神奕
这个作者很懒,什么都没留下…
展开
-
堆排序的算法实现
由于堆排序算法说起来原创 2014-05-01 20:20:44 · 1935 阅读 · 0 评论 -
【动态规划】Dynamic Programming
动态规划一、动态规划动态规划(Dynamic Programming)是一种设计的技巧,是解决多阶段决策过程最优化问题的通用方法。基本思想:将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解(这部分与分治法相似)。与分治法不同的是,适合于用动态规划求解的问题,经分解得到的子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些原创 2014-11-27 16:41:49 · 21143 阅读 · 0 评论 -
【动态规划】输出所有的最长公共子序列
上篇讲到使用动态规划可以在 θ(mn) 的时间里求出 LCS 的长度,本文将讨论如何输出最长公共子序列。问题描述:给定两个序列,例如 X = “ABCBDAB”、Y = “BDCABA”,求它们的最长公共子序列的长度。下面是求解时的动态规划表,可以看出 X 和 Y 的最长公共子序列的长度为4:输出一个最长公共子序列其实并不难,我们只需要在动态规划表的基础上进行回溯 —— 从tabl原创 2014-11-29 15:41:34 · 20321 阅读 · 6 评论 -
二叉查找树(BST)
二叉查找树(BST)二叉查找树(Binary Search Tree)又叫二叉排序树(Binary Sort Tree),它是一种数据结构,支持多种动态集合操作,如 Search、Insert、Delete、Minimum 和 Maximum 等。二叉查找树要么是一棵空树,要么是一棵具有如下性质的非空二叉树:若左子树非空,则左子树上的所有结点的关键字值均小于根结点的关键字值原创 2015-01-10 23:44:23 · 2521 阅读 · 0 评论 -
DES加密算法的C++实现
《信息安全技术》这门课又在讲 DES 加密算法了,以前用纯C写过一次,这次我用 C++ 重新写了一个,写篇文章以备后用。本文介绍了 DES 算法加密的大致步骤和整体流程。一、DES算法原理DES算法是一种最通用的对称密钥算法,因为算法本身是公开的,所以其安全性在于密钥的安全性。基于密钥的算法通常有两类:对称算法和公开密钥算法。对称算法的对称性体现在加密密钥能够从解密密钥推算出来,反之亦然。原创 2014-12-06 18:31:19 · 79897 阅读 · 29 评论 -
AES加密算法的C++实现
摘要:作为新一代的加密标准,AES 旨在取代 DES(请看《DES加密算法的C++实现》),以适应当今分布式开放网络对数据加密安全性的要求。本文在分析了 AES 加密原理的基础上着重说明了算法实现的具体步骤,并用 C++ 实现了对文件的加密和解密。一、AES 介绍AES(高级加密标准,Advanced Encryption Standard),在密码学中又称 Rijndael 加密法,原创 2014-12-13 14:25:05 · 72256 阅读 · 32 评论 -
设计并实现一个LRU Cache
一、什么是Cache1 概念Cache,即高速缓存,是介于CPU和内存之间的高速小容量存储器。在金字塔式存储体系中它位于自顶向下的第二层,仅次于CPU寄存器。其容量远小于内存,但速度却可以接近CPU的频率。当CPU发出内存访问请求时,会先查看 Cache 内是否有请求数据。如果存在(命中),则直接返回该数据;如果不存在(失效),再去访问内存 —— 先把内存中的相应数据载入缓存,再将其返回处理器。原创 2015-05-09 15:17:04 · 6487 阅读 · 0 评论 -
Trie树(Prefix Tree)介绍
本文用尽量简洁的语言介绍一种树形数据结构 —— Trie树。一、什么是Trie树Trie树,又叫字典树、前缀树(Prefix Tree)、单词查找树 或 键树,是一种多叉树结构。如下图: 上图是一棵Trie树,表示了关键字集合{“a”, “to”, “tea”, “ted”, “ten”, “i”, “in”, “inn”} 。从上图可以归纳出Trie树的基本性质:根节点不包含字符,除根节点原创 2015-05-09 01:49:47 · 62696 阅读 · 5 评论 -
求最长回文子串
回文串,就是指正读和反读都一样的字符串,比如"level"或者"noon"等等。那么,如何求一个字符串的最长回文子串(Longest Palindromic Substring)?通常我们有多种解法。解法一:暴力法暴力解法就是直接枚举所有子串,对每个子串判断是否为回文,时间复杂度为O(n3)O(n^3)。这是最糟糕的方法,相信面试官问你这个问题,绝对不是想要这个答案。解法二:动原创 2015-05-12 20:50:35 · 1178 阅读 · 1 评论 -
拓扑排序(Topological Sorting)
一、什么是拓扑排序在图论中,拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列。且该序列必须满足下面两个条件:每个顶点出现且只出现一次。若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面。有向无环图(DAG)才有拓扑排序,非DAG图没有拓扑排序一说。例如,下面这个图原创 2015-05-07 01:56:17 · 214493 阅读 · 26 评论 -
算术表达式的合法性判断与求值(下)
上一篇讲到,通过编译原理的方法(词法分析和语法分析)来判断字符串表示的算术表达式的合法性。这一篇,接着讲在算术表达式合法的情况下,对表达式进行求值。问题:给定一个字符串,只包含 '+'、'-'、'*'、'/'、数字、小数点、'(' 、')'。 要求:(1) 判断该算术表达式是否合法; (2) 如果合法,计算该表达式的值。三、算术表达式的求值表达式的求值是栈应用的一个典型范例原创 2014-10-07 11:05:47 · 10523 阅读 · 3 评论 -
算术表达式的合法性判断与求值(上)
在写一个计算器时遇到了一个问题,就是对字符串表示的算术表达式的合法性判断与求值。下面记录一下我的解决方案。一、问题描述问题:给定一个字符串,只包含 '+'、'-'、'*'、'/'、数字、小数点、'(' 、')'。要求:(1) 判断该算术表达式是否合法; (2) 如果合法,计算该表达式的值。二、判断表达式的合法性相信学过《编译原理》的人都知道,利用里面讲的分析方法可以对源代码进行原创 2014-10-06 20:37:37 · 17801 阅读 · 5 评论 -
第K顺序统计量的求解
一个n个元素组成的集合中,第K个顺序统计量(Order Statistic)指的是该集合中第K小的元素,我们要讨论的是如何在线性时间(linear time)里找出一个数组的第K个顺序统计量。一、问题描述问题:给定一个含有n个元素的无序数组,找出第k小的元素。k = 1 :最小值k = n :最大值k = ⌊(n+1)/2⌋ or ⌈(n+1)/2⌉ :中位数找最大值或最小值很原创 2014-06-22 22:43:36 · 5227 阅读 · 0 评论 -
二叉树遍历序列的求解
一,由遍历序列构造二叉树 上面为一个二叉树,可知它的遍历序列分别为: 先序遍历:ABDECFG 中序遍历:DBEAFCG 后序遍历:DEBFGCA 我们需要知道的是,由二叉树的先序序列和中序序列可以唯一地确定一棵二叉树;原创 2014-03-20 23:40:20 · 1780 阅读 · 0 评论 -
矩阵原地转置
一,问题描述 微软面试题:将一个MxN的矩阵存储在一个一维数组中,编程实现矩阵的转置。 要求:空间复杂度为O(1)二,思路分析 下面以一个4x2的矩阵A={1,2,3,4,5,6,7,8}进行分析,转置过程如下图: 图中右下角的红色数字表示在一维数组中的下标。矩阵的转置其实就是数组中元素的移动,具体的移动过程如下图:我们发现,这些移动的元素原创 2014-06-06 17:36:26 · 4947 阅读 · 0 评论 -
位图排序
最近在看《》原创 2014-06-02 01:07:56 · 1333 阅读 · 0 评论 -
广度优先搜索的实现
图的遍历是指从图中的某一个顶点出发,按照某种搜索方法沿着图中的边对图中的所有顶点访问一次且仅访问一次。注意到树是一种特殊的图,所以树的遍历实际上也可以看作是一种特殊的图的遍历。图的遍历主要有两种算法:广度优先搜索(Breadth-First-Search)和深度优先搜索(Depth-First-Search)。一、广度优先搜索(BFS)的算法思想广度优先搜索类似于二叉树的层序遍历,它的基本原创 2014-07-03 21:36:21 · 4730 阅读 · 0 评论 -
一维向量旋转算法
《编程珠玑》第二章提到了n元一维向量旋转算法(又称数组循环移位算法)的五种思路,并且比较了它们在时间和空间性能上的区别和优劣。一,问题描述 将一个n元一维向量向左旋转i个位置。例如,假设n=8,i=3,向量abcdefgh旋转为向量defghabc。简单的代码使用一个n元的中间向量在n步内可完成该工作。你能否仅使用几十个额外字节的内存空间,在正比于n的时间内完成向量的旋转?二,解原创 2014-06-05 12:04:07 · 1455 阅读 · 0 评论 -
变位词问题
《编程珠玑》第二章提到了一个变位词问题,变位词指的是一个单词可以通过改变其他单词中字母的顺序来得到,也叫做兄弟单词,如army->mary。由变位词可以引申出几个算法问题,包括字符串包含问题,比较两个字符串是否是变位词,以及找出字典中变位词集合的问题。一,字符串包含问题 (1) 问题描述:存在字符串1和字符串2,假设字符串2相对较短,如何快速地判定字符串2中的字符都存在于字符串1里(原创 2014-06-05 22:16:34 · 3231 阅读 · 0 评论 -
深度优先搜索的实现
图的遍历是指从图中的某一个顶点出发,按照某种搜索方法沿着图中的边对图中的所有顶点访问一次且仅访问一次。注意到树是一种特殊的图,所以树的遍历实际上也可以看作是一种特殊的图的遍历。图的遍历主要有两种算法:广度优先搜索(Breadth-First-Search)和深度优先搜索(Depth-First-Search)。一、深度优先搜索(DFS)的算法思想深度优先搜索算法所遵循的搜索策略是尽可能“深原创 2014-07-04 16:06:03 · 10687 阅读 · 0 评论 -
快速排序的分析与优化
一、快速排序的介绍快速排序是一种排序算法,对包含n个数的输入数组,最坏的情况运行时间为Θ(n2)[Θ 读作theta]。虽然这个最坏情况的运行时间比较差,但快速排序通常是用于排序的最佳的实用选择。这是因为其平均情况下的性能相当好:期望的运行时间为 Θ(nlgn),且Θ(nlgn)记号中隐含的常数因子很小。另外,它还能够进行就地排序,在虚拟内存环境中也能很好的工作。和归并排序一样,快速排序也原创 2014-06-21 22:07:19 · 1858 阅读 · 2 评论 -
线性时间的排序算法
前面已经介绍了几种排序算法,像插入排序(直接插入排序,折半插入排序,希尔排序)、交换排序(冒泡排序,快速排序)、选择排序(简单选择排序,堆排序)、2-路归并排序(见我的另一篇文章:各种内部排序算法的实现)等,这些排序算法都有一个共同的特点,就是基于比较。本文将介绍三种非比较的排序算法:计数排序,基数排序,桶排序。它们将突破比较排序的Ω(nlgn)下界,以线性时间运行。一,比较排序算法的时间下界原创 2014-06-22 14:19:01 · 1916 阅读 · 0 评论 -
各种内部排序算法的实现
最近比较原创 2014-05-01 22:31:11 · 1802 阅读 · 0 评论