![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构&算法
文章平均质量分 64
zealot_2002
这个作者很懒,什么都没留下…
展开
-
KMP算法详解
如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段。 我们这里说的KMP不是拿来放电影的(虽然我很喜欢这个软件),而是一种算法。KMP算法是拿来处理字符串匹配的。换句话说,给你两个字符串,你需要回答,B串是否是A串的子串(A串是否包含B串)。比如,字符串A="I'm matrix67",字符串B="matrix",我们就说B是A的子串。你可以委婉地问你的MM:“假转载 2012-11-27 16:21:55 · 428 阅读 · 0 评论 -
最常见的程序员面试题(12)观察者模式和weak_ptr
观察者模式是非常常用的,写出松耦合框架代码的设计模式。常见的问题是:(1) 如何实现一些列的观察者? A: 用一个EventManager来注册和反注册。(2) 对于被观察者,如何做到通知观察者一个对象已经没有了? 第一种方法是在被观察者对象的析构函数中调用Unregister。这样可以工作,但是问题是需要修改"被观察者"的析构函数代码,破坏了"观察者"这个语义的封装性,使得被观察者和设计转载 2012-11-30 09:54:22 · 1536 阅读 · 0 评论 -
最常见的程序员面试题(2)二叉树逐层打印
二叉树的遍历都不能逐层访问。考虑用一个FIFO队列: 压入树根,然后:(1) 每次取出一个节点,打印数据。压入节点的左右子树(2) 删除队列头节点。(3) 循环(1)-(2)直到队列为空。用C++和Java分别实现。[cpp] view plaincopyprint?#include struct node{ explicit node(转载 2012-11-30 09:50:12 · 480 阅读 · 0 评论 -
最常见的程序员面试题(1)单链表反向
一个单链表如何反向? 在不增加额外链表对象的情况下。仔细的分析这个题目可以知道: 一个N长度的链表反向需要N次循环,也就是每次循环要改变一个next指针的值。同时,为了让循环能继续,当前的cur->next指针要保存下来,作为下次运行的cur指针。在用一个指针来保存反向后,新的next指针要指向的位置。 分别用C++和Java来实现。[cpp] view plaincop转载 2012-11-30 09:49:41 · 601 阅读 · 0 评论 -
二叉树的好处(应用)
二叉排序树是一种比较有用的折衷方案。 数组的搜索比较方便,可以直接用下标,但删除或者插入某些元素就比较麻烦。 链表与之相反,删除和插入元素很快,但查找很慢。 二叉排序树就既有链表的好处,也有数组的好处。 在处理大批量的动态的数据是比较有用。 文件系统和数据库系统一般都采用树(特别是B树)的数据结构数据,主要为排序和检索的效率。二叉树是一种最基本最典型转载 2012-11-30 17:13:03 · 28608 阅读 · 1 评论 -
计算机科学中的树
计算机科学中的树二叉树▪ 二叉树 ▪ 二叉查找树 ▪ 笛卡尔树 ▪ Top tree ▪ T树 自平衡二叉查找树▪ AA树 ▪ AVL树 ▪ 红黑树转载 2012-11-30 17:41:34 · 1382 阅读 · 0 评论 -
计算机科学中的数据结构
▪ 集合 ▪ 容器 ▪ 数组 ▪ 关联数组 ▪ Multimap ▪ 集 ▪ 多重集 ▪ 散列表 ▪ 树状数组 ▪ 列表 ▪ 链表 ▪ 队列 ▪ 堆栈 ▪ 循环队列转载 2012-11-30 17:45:53 · 637 阅读 · 0 评论 -
动态规划解决跳台阶问题
动态规划解决跳台阶问题分类: 算法/数据结构 C/C++2012-11-13 12:52 319人阅读 评论(0)收藏 举报目录(?)[+]问题描述问题分析程序代码总结问题描述某互联网公司的一道面试题,题目是一个人上台阶,台阶有n级,他可以一次上1级,可以一次上2级,也可以一次上3级,问上这个n级的台阶一共有多少种上法。转载 2012-12-02 16:46:31 · 2135 阅读 · 0 评论 -
10种排序算法总结
排序算法有很多,所以在特定情景中使用哪一种算法很重要。为了选择合适的算法,可以按照建议的顺序考虑以下标准: (1)执行时间 (2)存储空间 (3)编程工作 对于数据量较小的情形,(1)(2)差别不大,主要考虑(3);而对于数据量大的,(1)为首要。 主要排序法有: 一、冒泡(Bubble)排序——相邻交换 二、选择排序——每次最小/大排在相应的位置 三转载 2012-12-03 09:36:34 · 566 阅读 · 0 评论 -
经典排序算法
经典排序算法 经典排序算法,以下文章参考了大量网上的资料,大部分都给出了出处这一系列重点在理解,所以例子什么的都是最简单的情况,难免失误之处,多指教大多数排序算法都给出了每一步的状态,以方便初学者更容易理解,通俗易懂,部分难以理解的排序算法则给出了大量的图示,也算是一个特色吧经典排序算法 - 快速排序Quick sort 经典排序算法 - 桶排序Bucket sort转载 2012-12-03 09:45:05 · 538 阅读 · 0 评论 -
若干经典的字符串哈希函数
// RS Hash Function unsigned int RSHash( char * str) { unsigned int b = 378551; unsigned int a = 63689; unsigned int hash =转载 2012-11-21 09:02:48 · 403 阅读 · 0 评论 -
hash算法的作用是什么?
Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。 Hash算法在信息安全方面的应用主要体现在以下的3个方面: 1) 文件校验 我们比较熟悉的校转载 2012-11-21 09:04:01 · 2837 阅读 · 0 评论 -
最常见的程序员面试题(11)排序二叉树的序列化和反序列化
这是一个相当考察数据结构基础知识的题目。二叉树序列化本身很简单,中序遍历递归一遍就可以存储了。但是问题是要能反序列化成功,就必须把树形结构本身的信息保存下来。因为保存程序不能事先知道序列化以后左边和右边的树分别有多大,所以必须采用先序遍历,(1) 先保存当前子树的树根,节点的信息不再是指针,而是偏移量。如果没有左子树,则左偏移量为0。(2) 如果有左子树,则递归序列化保存左子树,保存的过程转载 2012-11-30 09:54:00 · 787 阅读 · 0 评论 -
最常见的程序员面试题(9)求和/求极值的问题
[问题1]用+-*等运算实现整数的除法 用逆运算很容易求解,关键是算法复杂度。可以预设一些乘数,例如1,2,4,8,16,32(也就是2^0,2^1,...2^n),然后我们用减法不断地判断区间(折半),例如20/3等于多少? 答案是6。那么求解过程是:(1)先找出2^n的n的区间,3*2^2 (2)余数部分是8,继续判断 3*2^1 (3)余数2小于除数3,不再转载 2012-11-30 09:53:16 · 569 阅读 · 0 评论 -
最常见的程序员面试题(8)常见的几种递归和堆栈问题
用堆栈解题可以做到递归能做的一切事情,同时还有些算法不是能很容易的由递归给出,因为涉及到状态存储的问题。几个经典的问题:问题(1) 自相似数列问题: 数列每增加一个数,都对称的构造原数列,求算法。 这个问题用递归很容易求解。公式f(n) = f(n-1), n, f(n-1)。但是如果题目要求不可以用递归呢? 用堆栈解决问题非常考验写程序人的思维能力。分别给出递归和非递归的版本。数列的形式像下转载 2012-11-30 09:52:53 · 655 阅读 · 0 评论 -
关于java的io读写,缓冲区是如何提高读写效率的???
据我了解,运用FileInputStream读写一段数据是一个字节一个字节的读取,如果有10个字节大小的文件,就要调用10次系统调用,每次将读取的数据赋值给变量,然后程序使用变量。缓冲区可以看作是一个放在内存中的数组,但是从硬盘中读取数据仍然要使用系统调用,系统调用的读取仍然是每次一个,只是每调用一次之后,将所得到的数据放入缓冲区中的,然后程序一次性使用10个数据。我是这样理解的,但是不管用与转载 2012-11-27 17:53:39 · 3332 阅读 · 1 评论 -
hash原理
散列方法不同于顺序查找、二分查找、二叉排序树及B-树上的查找。它不以关键字的比较为基本操作,采用直接寻址技术。在理想情况下,无须任何比较就可以找到待查关键字,查找的期望时间为O(1)。一、散列表的概念1、散列表 设所有可能出现的关键字集合记为U(简称全集)。实际发生(即实际存储)的关键字集合记为K(|K|比|U|小得多)。 散列方法是使用函数h将U映射到表T[0..m-1]的下标转载 2012-11-29 15:38:58 · 615 阅读 · 0 评论 -
hash原理及pascal代码
1. 引言 哈希表(Hash Table)的应用近两年才在NOI中出现,作为一种高效的数据结构,它正在竞赛中发挥着越来越重要的作用。 哈希表最大的优点,就是把数据的存储和查找消耗的时间大大降低,几乎可以看成是常数时间;而代价仅仅是消耗比较多的内存。然而在当前可利用内存越来越多的情况下,用空间换时间的做法是值得的。另外,编码比较容易也是它的特点之一。 哈希表转载 2012-11-29 15:41:28 · 548 阅读 · 0 评论 -
红黑树(Red Black Tree)
介绍今天我们来介绍另一种平衡二叉树:红黑树(Red Black Tree),红黑树由Rudolf Bayer于1972年发明,当时被称为平衡二叉B树(symmetric binary B-trees),1978年被Leonidas J. Guibas 和 Robert Sedgewick改成一个比较摩登的名字:红黑树。红黑树和之前所讲的AVL树类似,都是在进行插入和删除操作时通过特定操作保转载 2012-11-30 09:45:40 · 467 阅读 · 0 评论 -
最常见的程序员面试题(3)置换算法
数组置换的题目是一类非常简单的动态规划。因为没有确定的递归步骤和算法。(1) 例如,给出两个数组,要求调换数组当中的某些元素使得两个数组的各自元素之和,这两个和之间的绝对值之差最小。 怎么办呢? 循环扫描第一个数组当中的元素,比较第二个数组中的所有元素,如果某次对比发现交换他们能够使得交换之后的和的绝对值差最小,就交换这两个元素。反复进行直到扫描第一个数组每个元素都不需要再交换元素转载 2012-11-30 09:50:51 · 525 阅读 · 0 评论 -
最常见的程序员面试题(4)写一个能工作的Singleton
单件设计模式是非常常用的一种设计模式。当我有一个复杂的系统需要提供一个统一的配置界面的时候,这个配置对象和后台对象之间的交互常常是一对多的关系。那么配置对象常常就需要被设计成Singleton的实例。 最简单的singleton就是用一个全局对象或者函数内部的静态对象来实现。但是这样有两个明显的问题。(1) 全局对象是程序初始化的时候就构造的,如果程序启动要构造很多此类对象,会变转载 2012-11-30 09:51:14 · 480 阅读 · 0 评论 -
最常见的程序员面试题(5)Java/C++线程同步
Java线程同步是服务器技术的基础问题。大型网络服务器/应用服务器/数据库等均包含复杂的多线程实现。(1) 最常见的多线程同步的问题是和Singleton设计模式相关的。为了保证多线程在访问Singleton实例的时候没有多线程冲突,需要对代码进行保护。[java] view plaincopyprint?public class my { public转载 2012-11-30 09:51:41 · 514 阅读 · 0 评论 -
最常见的程序员面试题(6)计算最常用的URL地址
一个非常常见的面试/笔试题是,一个大型的互联网公司,每天有很多用户浏览。如果想根据用户浏览的信息记录,来看用户最常选用的浏览路径是什么,怎么办? 假设用户数据已经收集到了一个文件里面,这个文iande格式是这样的:(1)文件是文本文件,共若干行(2)每一行的格式都相同,例如"用户ID字符串 网址". 在用户ID字符串和网址之间可能有多个空格或者tab。用户ID可能是数字或者非数字(3)转载 2012-11-30 09:52:04 · 574 阅读 · 0 评论 -
最常见的程序员面试题(10)字符串的处理
字符串的搜索,匹配,查找,压缩,编码/解码,是一类非常常见的问题。(1) 压缩一个字符串当中的空格,例如把" I like csdn "压缩成"I like csdn"。注意,单词之间的空格,N个空格要压缩到1个,也就是要减少N-1个空格。行首/行尾的空格全部去掉。 算法复杂度O(n),扫描一遍,在扫描的过程中记住当前已经有了多少个多余的空格(pos),然后把非空格的字转载 2012-11-30 09:53:38 · 767 阅读 · 0 评论 -
Collection:List、SetMap:HashMap、HashTable
Collection:List、SetMap:HashMap、HashTable如何在它们之间选择一、Array , ArraysJava所有“存储及随机访问一连串对象”的做法,array是最有效率的一种。1、效率高,但容量固定且无法动态改变。array还有一个缺点是,无法判断其中实际存有多少元素,length只是告诉我们array的容量。2、Java中有一个Array转载 2012-11-30 10:30:23 · 550 阅读 · 0 评论 -
最常见的程序员面试题(7)二叉树转链表
二叉树通过遍历可以用于转化成一个链表(插入构建链表)。但是如果没有而外的链表呢? 这就用到"线索化二叉树",也就是一个二叉树(可以是排序二叉树)在座遍历(例如中序)的时候,去更新每个节点的"前驱"和"后继"的节点关系,得到一个二叉链表。然后从最左节点开始,遍历所有的"后继"节点,就得到一个二叉链表的所有数据。分别用C++和Java来实现。(1)第一种情况,也是简单的情况,允许以侵入的方式把二叉转载 2012-11-30 09:52:29 · 589 阅读 · 0 评论