
数据结构与算法
文章平均质量分 86
常用的数据结构与算法基本概念,数据结构与算法的具体实现,在项目中的应用
robert_chao
欢迎关注我的博客 https://www.lelecoding.cn
展开
-
算法系列(十三)图论基本概念和拓扑排序
图的定义一个图G=(V,E),由定点的集合V,和边的集合E组成。每一条边都是一副点对(v,w),边也称作弧,边上可以有权值。如果点对是有序的,那么图就是有向的。图中的一条路径是一个顶点序列w1,w2,w3......wN,如果图中包含一条从顶点到自身的边,那么这个路径就是环。有向无环图也成为DAG如果在一个无向图中每个顶点到其它顶点都存在路径,则称这个无向图是连通的。具有这样性质的原创 2016-07-11 14:49:20 · 5604 阅读 · 0 评论 -
算法系列(十二)散列
Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。标准库中包括Set和Map的散列实现,即HashSet类和HashMap类。HashSet的实现直接借助了HashMap。JDK中是使用原创 2016-07-08 21:36:24 · 7168 阅读 · 0 评论 -
算法系列(十一)BASE64算法实现和使用说明
完整的BASE64定义可见RFC 1421和RFC 2045。编码后的数据比原始数据略长,为原来的43。在电子邮件中,根据RFC 822规定,每76个字符,还需要加上一个回车换行。可以估算编码后数据长度大约为原长的135.1%。转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。数据不足3byte的话,于缓冲器中剩下的bit用0补足。然后,每次原创 2016-07-01 10:28:52 · 7307 阅读 · 0 评论 -
算法系列(十)堆实现优先队列
堆实际上是一棵完全二叉树,其任何一非叶节点满足性质:Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]或者Key[i]>=Key[2i+1]&&key>=key[2i+2]即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。堆分为大顶堆和小顶堆,满足Key[i]>=Key[2i+1]&&key>=key[2i+2]称为大顶堆,满足 Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]称为小顶堆。由上述性质可知大顶堆的堆顶的关键字肯定是所有关键字原创 2016-06-22 15:16:06 · 3571 阅读 · 0 评论 -
CPU概念和调度算法
1、物理CPU、逻辑CPU、CPU核数(1) 一个物理CPU上有多个CPU核,如果采用了intel的超线程技术(HT), 就会再多出一倍的cpu核出来(2)一般情况下,逻辑cpu数=物理CPU*cpu核数(3)如果采用了超线程技术,则正常逻辑cpu数=物理CPU*cpu核数*2top看到的cpu个数以及java中的Runtime.getRuntime().availableProcessors()获得到的都是逻辑cpu数。top看到的cpu个数以及java中的Runtime.getRuntime原创 2016-06-12 09:18:03 · 5599 阅读 · 3 评论 -
算法系列(九)平衡二叉查找树AVL树
在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下都是O(log n)。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。一棵AVL树是其每个节点的左子树和右子树的高度最多差1的二叉查找树。高度为 h 的 AVL 树,节点数 N 最多2^h − 1; 最少N(h)=N(h− 1) +N(h− 2) + 1。原创 2016-06-10 18:27:01 · 3601 阅读 · 0 评论 -
算法系列(八)数据结构之二叉查找树
在算法系列(七)数据结构之树的基本结构和二叉树的遍历 中介绍了基本的树结构,二叉树的实现和遍历。这篇文章重点学习一下二叉查找树。概述二叉排序树(Binary Sort Tree)又称二叉查找树(Binary Search Tree)二叉搜索树。二叉查找树(BST)是二叉树的一个重要的应用,它在二叉树的基础上加上了这样的一个性质:对于树中的每一个节点来说,如果有左儿子的话原创 2016-06-09 01:03:14 · 3567 阅读 · 0 评论 -
算法系列(七)数据结构之树的基本结构和二叉树的遍历
一、概述在算法系列(六)数据结构之表队列和栈 一文中介绍了数据结构中的基本线性数据结构。对于大量的数据,链表访问时间太慢,而数组插入删除时间太慢。我们讨论一下数据结构树。 树结构大部分操作平均运行时间都为O(logN)二、树的定义树是由n(n>=1)个有限节点组成一个具有层次关系的集合。每个节点有零个或多个子节点;没有父节点的节点称为根节点;每一个非根节点有且只有一个父节点;除了根原创 2016-06-06 22:55:21 · 3832 阅读 · 0 评论 -
算法系列(六)数据结构之表队列和栈
在http://blog.youkuaiyun.com/robertcpp/article/details/51559333一文中,我们讲了排序,这一章来介绍一下基本数据结构:表、队列、栈和它们的简单实现一、表ADT1、数组实现顺序表通过对数组操作,来直接对表进行增删查改操作,这种线性表查找某个位置的元素花费的时间为O(1),但是插入删除元素花费的时间为O(n),如果对表的操作更多的是访问操作,那原创 2016-06-04 07:50:41 · 3355 阅读 · 2 评论 -
算法系列(五)排序算法下篇--如何超越排序算法下界
概述在算法系列(四)排序算法中篇--归并排序和快速排序一文中,我们介绍了归并排序和快速排序,最坏的情况下,最快的排序算法的时间复杂度是O(nlogn),是否有更好的算法呢?到目前为止,没有特殊的规则,O(nlogn)已经是最好的排序算法了,也就是说通用排序算法的时间复杂度下界就是O(nlogn)。如果限定一些规则,是可以打破这个下界的。下面说一下尽在O(n)时间内就能实现对数组排序的算法。原创 2016-06-01 23:57:56 · 5418 阅读 · 0 评论 -
算法系列(一)基本概念
一、什么是算法算法是完成一个任务所需的一系列步骤,计算机解决计算机问题,我们希望从一个计算机算法中获得两个结果,给定一个输入,它应该总能够产生该问题的正确输出结果,并且在运行该算法时,能够有效的利用资源。(出自《算法基础》)算法是为求解一个问题所需要遵循的、被清楚指定的简单指令集合。(出自《数据结构与算法分析》)二、数学基础1、如果存在常数c和n0,使得当N>=n0时,T(N)原创 2016-05-29 10:17:54 · 5006 阅读 · 0 评论 -
算法系列(四)排序算法中篇--归并排序和快速排序
在算法系列(三)排序算法上篇 一文中,介绍了冒泡排序,插入排序和选择排序算法。这篇文章继续讲解排序算法。概述冒泡排序,插入排序和选择排序算法这些算法的时间复杂度都是O(N^2),是否有更高效的排序算法呢?当然有了,堆排序,归并排序,快速排序,它们的时间复杂度都是O(nlogn)。堆排序使用了树结构,到目我们前还没有介绍树相关的算法,这里先分析归并排序跟快速排序。归并排序基本原理原创 2016-05-30 23:04:57 · 8876 阅读 · 0 评论 -
算法系列(三)排序算法上篇--冒泡排序插入排序和选择排序
排序算法概述排序算法比较多,分两个篇幅来讲。由易道难。先总体看一下都有哪些排序算法冒泡排序,选择排序,插入排序,归并排序,堆排序,快速排序,计数排序,基数排序,希尔排序,桶排序。排序算法分类根据排序过程中待排序文件存放的位置不同,可以把排序分为内部和外部排序两大类。在排序过程中,所有需要排序的数都在内存,并在内存中调整它们的存储顺序,称为内排序;在排序过程中,只有部分数被调入内原创 2016-05-29 22:34:39 · 1854 阅读 · 0 评论 -
签名工具的使用
下面是OPENSSL生成密钥对示例: 一,使用RSA算法: 生成私钥:openssl genrsa -out privatekey.key 1024 对应公钥:openssl rsa -in privatekey.key -pubout -out pubkey.keyjava -Xmx2048m -jar out/host/linux-x86/framework/signa原创 2015-01-08 13:27:24 · 4550 阅读 · 0 评论 -
算法系列(二)查找算法--基本查找和二分查找
从n个元素中A0,A1....An-1中,找到要找到的元素x,最简单的方法是遍历n个元素,找到元素x则返回x的位置,这种算法的时间复杂度为O(n)。如果这n个元素是有序的,我们不需要从头到尾遍历一遍就可以找到要查找的元素,可以使用二分法。二分查找的时间复杂度是O(lgn)二分查找的前提是元素有序(一般是升序),基本思想是拿中间元素A[m]与要查找的元素x进行比较,如果相等,则已经找到,如果原创 2016-05-29 16:58:32 · 15301 阅读 · 1 评论 -
模式匹配
#include#include#includeusing namespace std; char a[1000]="abcabaabcacabaabcdefg"; //原串 char b[10]="abaabcac"; //目标串 int next[10]; //存储next值void nextj(char b[]){原创 2011-11-05 19:56:37 · 867 阅读 · 0 评论