算法
liuhmmjj
对计算机编程很有兴趣
展开
-
详解直接插入排序
直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。第一种程序:void InsertSort1(int arr[] , int n) { for(int i=1;i//循环从第二个数组元素开始,因为arr[0]作为最初已排序部分原创 2015-01-27 15:06:12 · 1589 阅读 · 0 评论 -
字典树
1.1、什么是Trie树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。 Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。它有3个原创 2015-03-30 09:48:22 · 845 阅读 · 1 评论 -
经典回溯算法(八皇后问题)详解
八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上(斜率为1),问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种方法可原创 2015-04-06 13:58:22 · 20982 阅读 · 6 评论 -
回溯法
1、概念 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。 回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。原创 2015-04-06 14:01:32 · 1536 阅读 · 0 评论 -
C++洗牌算法
1、使用标准库中的random_shuffle()函数实现很简单,代码如下:int main() { vectorint> s_stl; for (int i=0; i random_shuffle(s_stl.begin(),s_stl.end()); cout "使用C++算法库:"; for (vectorint>::iterator it=s_st原创 2015-04-11 12:22:37 · 15936 阅读 · 1 评论 -
详解括号匹配问题(STL stack)
1. 括号匹配的四种可能性:①左右括号配对次序不正确②右括号多于左括号③左括号多于右括号④左右括号匹配正确2. 算法思想:1.顺序扫描算数表达式(表现为一个字符串),当遇到三种类型的左括号时候让该括号进栈;2.当扫描到某一种类型的右括号时,比较当前栈顶元素是否与之匹配,若匹配,退栈继续判断;3.若当前栈顶元素与当前扫描的括号不匹配,则左右括号配对次序不正确,匹配原创 2015-03-18 14:37:32 · 2421 阅读 · 0 评论 -
动态规划
什么是动态规划(DP)?1)动态规划是运筹学中用于求解决策过程中的最优化数学方法。 当然,我们在这里关注的是作为一种算法设计技术,作为一种使用多阶段决策过程最优的通用方法。它是应用数学中用于解决某类最优化问题的重要工具。2)如果问题是由交叠的子问题所构成,我们就可以用动态规划技术来解决它,一般来说,这样的子问题出现在对给定问题求解的递推关系中,这个递推关系包含了相同问题的更小子问题的解原创 2015-04-06 18:20:23 · 1089 阅读 · 0 评论 -
通过金矿模型介绍动态规划(经典入门)
对于动态规划,每个刚接触的人都需要一段时间来理解,特别是第一次接触的时候总是想不通为什么这种方法可行,这篇文章就是为了帮助大家理解动态规划,并通过讲解基本的01背包问题来引导读者如何去思考动态规划。本文力求通俗易懂,无异性,不让读者感到迷惑,引导读者去思考,所以如果你在阅读中发现有不通顺的地方,让你产生错误理解的地方,让你难得读懂的地方,请跟贴指出,谢谢!----第一节----初识动态原创 2015-04-06 18:40:25 · 2165 阅读 · 3 评论 -
Bitmap
什么是Bit-map所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。来看一个具体的例子,假设我们要对0-7内的5个元素(4,7,2,5,3)排序(这里假设这些元素没有重复)。那么我们就可以采用Bit-map的方法来达到排序的目的。要表示8个数,我们就只需要8个Bit(1B原创 2015-04-13 10:37:10 · 1297 阅读 · 1 评论 -
位图的经典题目
有一个数组,里面的数在1到N之间,N最大为32000.数组中可能有重复的元素(即有的元素 存在2份),你并不知道N是多少。给你4KB的内存,你怎么把数组中重复的元素打印出来。解答我们有4KB的内存,一共有4 * 210 * 8位,大于32000,所以我们可以用Bit Map 来做这道题目。我们可以写一个Bit Map类来完成基本的位操作。为了代码的简洁, 我们假设程序是运行原创 2015-06-06 09:24:44 · 979 阅读 · 0 评论 -
二分搜索经典题目
Given a sorted array of strings which is interspersed with empty strings, write a method to find the location of a given string.Example: find “ball” in [“at”, “”, “”, “”, “ball”, “”, “”, “car”, “”原创 2015-06-07 09:38:56 · 1175 阅读 · 0 评论 -
红黑树
二叉搜索树是个很好的数据结构,可以快速地找到一个给定关键字的数据项,并且可以快速地插入和删除数据项。但是二叉搜索树有个很麻烦的问题,如果树中插入的是随机数据,则执行效果很好,但如果插入的是有序或者逆序的数据,那么二叉搜索树的执行速度就变得很慢。因为当插入数值有序时,二叉树就是非平衡的了,排在一条线上,其实就变成了一个链表……它的快速查找、插入和删除指定数据项的能力就丧失了。 为了转载 2016-09-01 18:30:48 · 4726 阅读 · 0 评论 -
将两个有序链表合并成一个有序链表
问题定义: 写一个函数SortedMerge函数,该函数有两个参数,都是递增的链表,函数的功能就是合并这两个递增的链表为一个递增的链表,SortedMerge的返回值是新的链表。新链表由前两个链表按元素递增顺序合并而成,也就是说它不会创建新的元素。比如:这里有两个链表,分别是list1: 5->10->15list2: 2->3->20Sort原创 2015-03-29 10:51:45 · 7576 阅读 · 0 评论 -
快速排序
快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。该方法的基本思想是:1.先从数列中取出一个数作为基准数。2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。3.再对左右区间重复第二步,直到各区间只有一个数。<span styl...原创 2015-03-08 13:15:59 · 925 阅读 · 0 评论 -
滚动数组
滚动数组的作用在于优化空间,主要应用在递推或动态规划中(如01背包问题)。因为DP题目是一个自底向上的扩展过程,我们常常需要用到的是连续的解,前面的解往往可以舍去。所以用滚动数组优化是很有效的。利用滚动数组的话在N很大的情况下可以达到压缩存储的作用。一个简单的例子:斐波那契数列:一般代码:[cpp] view plaincopy转载 2015-03-01 16:03:20 · 545 阅读 · 0 评论 -
轻松搞定面试中的二叉树题目
版权所有,转载请注明出处,谢谢!http://blog.csdn.net/walkinginthewind/article/details/7518888树是一种比较重要的数据结构,尤其是二叉树。二叉树是一种特殊的树,在二叉树中每个节点最多有两个子节点,一般称为左子节点和右子节点(或左孩子和右孩子),并且二叉树的子树有左右之分,其次序不能任意颠倒。二叉树是递归定义的,因此,与二叉树转载 2015-03-01 16:32:43 · 650 阅读 · 0 评论 -
内排序和外排序
内排序:指在排序期间数据对象全部存放在内存的排序。外排序:指在排序期间全部对象太多,不能同时存放在内存中,必须根据排序过程的要求,不断在内,外存间移动的排序。根据排序元素所在位置的不同,排序分: 内排序和外排序。内排序:在排序过程中,所有元素调到内存中进行的排序,称为内排序。内排序是排序的基础。内排序效率用比较次数来衡量。按所用策略不同,内排序又可分为插入排序、选择排序、交原创 2015-03-15 14:09:56 · 7490 阅读 · 0 评论 -
求字符串中最长无重复字符的子串
题目:求一个字符串中最长的没有重复字符的子串。方法一:穷举法,使用2重外循环遍历所有的区间,用2重内循环检验子串是否符合“无重复字符”这一要求。其中外层循环i、j 遍历所有的下标,m、n是内层循环,检查区间[i,j]是否符合要求。空间复杂度是O(1),时间复杂度O(N^4)。//O(N^4)的时间复杂度int max_unique_substring1(char * str){转载 2015-03-09 09:22:22 · 890 阅读 · 0 评论 -
编程珠玑:变位词程序的实现
这个程序的实现有助于压缩key的大小,使查找效率更高1.问题描述 给定一本英语单词词典,请找出所有的变位词集。所谓的变位词是指,组成各个单词的字母完全相同,只是字母排列的顺序不同。 2.解决思路编程珠玑的变位词程序要按照三个步骤来执行,其中前一个步骤程序的输出作为下一个步骤程序的输入:第一:程序标识单词,第二:程序排序标识后的文件,原创 2015-03-09 09:31:24 · 810 阅读 · 0 评论 -
2015阿里秋招其中一个算法题(经典)
写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这棵二叉树中相差最大的两个节点间的差值绝对值。请注意程序效率这是2015阿里秋招的一个在线笔试题实现方法很简单,遍历一遍二叉树,找出最大最小,一相减就可以求出最大的差值之前在做题的时候居然写递归的方法求值,后面测试了一下,果然结果不对只要是非递归的的方法遍历都可以很容易找出最大值最小值,效原创 2015-03-15 12:34:47 · 1901 阅读 · 1 评论 -
分治法求逆序对数目
设A[1..n]是一个包含n个不同整数的数组。如果在iA[j],则(i,j)就称为A中的一个逆序对(inversion)。给出一个算法,确定n个元素的任何排列中逆序对的书目。时间复杂度为o(nlgn)。分治法求解思路:分解:将数组A[1..n]分为两个子序列A[1..p]和A[p+1,n],二分法将其分解。。解决:根据归并排序的思想,在合并过程中,计算逆序对。假如两原创 2015-03-27 20:12:49 · 8130 阅读 · 1 评论 -
单链表和双链表逆序
单链表逆序一、结点结构 单链表的数据结构定义如下: typedef struct node { ElemType data; struct node *next; }list; 其中,ElemType可以是任意数据类型如int、float或者char等,原创 2015-03-13 16:19:05 · 1272 阅读 · 1 评论 -
编程珠玑:单词频率最高选取
问题描述:对一个输入文本中的每个单词的出现次数统计,并选取出现频率最大的10个单词#include #include #include string> #include #include #include using namespace std; typedef pairstring, int> PAIR;int cmp原创 2015-03-09 09:25:36 · 1015 阅读 · 0 评论 -
归并排序详解
归并排序的核心思想是将两个已经排序的序列合并成一个序列,那如何得到两个已经排序的序列呢?我们知道, 如果一个序列只有一个元素,那该序列是已经排序的,这样我们就可以利用分治的思想,将未排序的序列划分成更小的序列,只到我们可以很方便的对小序列进行排序(比如划分到序列只有一个元素, 或者序列很小可以方便的使用其它排序算法进行排序),然后再将小序列逐次合并,得到最后的排序结果。#include原创 2015-03-08 12:23:09 · 10034 阅读 · 3 评论 -
双向冒泡
#include "stdafx.h"#include #include //一般的冒泡排序void bubbleSort(int a[],int n){ int i, j, k; int temp; for (i = 0; i //最多做n-1趟排序原创 2015-02-07 15:32:29 · 1257 阅读 · 0 评论 -
数组与链表的优缺点
数组,在内存上给出了连续的空间.链表,内存地址上可以是不连续的,每个链表的节点包括原来的内存和下一个节点的信息(单向的一个,双向链表的话,会有两个). 数组优于链表的: 1.内存空间占用的少,因为链表节点会附加上一块或两块下一个节点的信息.但是数组在建立时就固定了.所以也有可能会因为建立的数组过大或不足引起内存上的问题. 2.数组内的数据可随机访问.但链表不具备随机访问性.这个很容原创 2015-03-14 14:05:50 · 39421 阅读 · 2 评论