Algorithm&DS
文章平均质量分 84
_北方的雪_
这个作者很懒,什么都没留下…
展开
-
编程中的双缓冲技术
void Credraw_exView::OnDraw(CDC* pDC){ Credraw_exDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); CPoint ptCenter; CRect rect,ellipseRect; GetClientRect(&rect); ptCenter = rect.CenterPoint();原创 2013-09-03 18:29:29 · 908 阅读 · 0 评论 -
数据结构之(图存储结构之)邻接矩阵
图的邻接矩阵:适用范围:时间复杂度:具体程序如下:// CreateGraph_AdjacencyMatrix.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include "stdio.h" //#include "stdlib.h" #d原创 2013-10-24 19:56:55 · 980 阅读 · 1 评论 -
数据结构之(动态规划)之最优二叉查找树
1、前言: 接着学习动态规划方法,最优二叉查找树问题。二叉查找树参考http://www.cnblogs.com/Anker/archive/2013/01/28/2880581.html。如果在二叉树中查找元素不考虑概率及查找不成功的情况下,可以采用红黑树或者平衡二叉树来搜索,这样可以在O(lgn)时间内完成。而现实生活中,查找的关键字是有一定的概率的,就是说有的关键字可能经常被搜索,转载 2013-09-26 23:24:44 · 1587 阅读 · 0 评论 -
数据结构之(哈希算法)
对于char* str,常用的哈希算法(信息加密)有如下:BKDRHash:1)hash = hash * seed + (*str++)2)hash初始值为0· 3)seed: 31 、131 、1313、 13131 、131313 etc..ELFHash:1)SDBMHash:1)hash = 65599*hash + (*str++);2)hash原创 2013-09-11 19:37:02 · 2016 阅读 · 0 评论 -
数据结构之(归并排序)
1. 归并排序算法?其基本思想是:假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度是1,然后两两归并,得到[n/2]个长度为2或1的有序子序列;再两两归并,…..,如此重复,直至得到一个长度是n的有序序列为止。2. 时间复杂度总体的复杂度为O(NlogN)// MergeSort.cpp : Defines the entry原创 2013-10-12 23:36:32 · 621 阅读 · 0 评论 -
《算法导论》之动态规划和贪心算法 0-1背包问题
1、前言 前段时间忙着搞毕业论文,看书效率不高,导致博客一个多月没有更新了。前段时间真是有些堕落啊,混日子的感觉,很少不爽。今天开始继续看算法导论。今天继续学习动态规划和贪心算法。首先简单的介绍一下动态规划与贪心算法的各自特点及其区别。然后针对0-1背包问题进行讨论。最后给出一个简单的测试例子,联系动态规划实现0-1背包问题。2、动态规划与贪心算法 关于动态规划的总结请转载 2013-10-27 18:34:20 · 2482 阅读 · 0 评论 -
《算法导论》之 贪心算法—活动选择问题
前言:贪心算法也是用来解决最优化问题,将一个问题分成子问题,在现在子问题最优解的时,选择当前看起来是最优的解,期望通过所做的局部最优选择来产生一个全局最优解。书中先从活动选择问题来引入贪心算法,分别采用动态规划方法和贪心算法进行分析。本篇笔记给出活动选择问题的详细分析过程,并给出详细的实现代码进行测试验证。关于贪心算法的详细分析过程,下次在讨论。1、活动选择问题描述 有一个需转载 2013-10-27 18:33:11 · 1088 阅读 · 0 评论 -
《剑指offer》第一章
1. 单元测试;2. 先写测试用例,再写实现函数;3. 查看内存,分析调用栈;4. 阐述问题:为了解决什么问题,做了哪些工作,具体是怎么做的;5. 边界条件、特殊输入符检测;6. 有了清晰思路后,再写代码;7. 画图、举例、分解问题。Reference:1) http://wenku.baidu.com/view/84575e1ba76e58fafa原创 2013-11-28 19:09:52 · 664 阅读 · 0 评论 -
《剑指offer》第2章总结
1. Singleton模式,该设计模式的主要用途;2. 对数组名使用sizeof时,得到的是数组的个数;而指针是地址的字节个数;3. 在创建链表、树、栈、队列时,通常为创建函数传入一个对象的双指针;4. 红黑树:Set、MultiSet、map、Multimap;5. 在处理链表、树、栈和队列时,要大胆使用递归原创 2013-12-20 21:24:48 · 575 阅读 · 0 评论 -
《剑指offer》第三章 高质量的代码 总结
1. 代码的规范性1) 书写清晰;2) 布局清晰;3) 命名合理,我常用的命名方式是匈牙利命名法2. 代码的完整性1) 代码的完整性通常可以从功能测试、边界测试和负面测试三个方面的测试用例来保证;2) 错误处理的方法,常见的有三种a) 函数用返回值来告知调用者函数是否出错,这种方法不便之处就是不能直接把计算原创 2014-01-21 20:51:18 · 718 阅读 · 0 评论 -
《剑指offer》第四章 解决面试题的思路 总结
常见的解决思路、方法是:画图、举例以及分解。1. 画图:将抽象的问题具体化;2. 举例:将抽象的问题具体化;在面对较难或时间复杂度要求较高的问题时,通常引入辅助空间(栈,队列、哈希表等);3. 分解:分解让较复杂的问题一步一步解决,使之简单化; 常见的分解方法有分治法、动态规划法等;4. 注意递归的灵活调用(和while循环的原创 2014-02-13 00:50:33 · 736 阅读 · 0 评论 -
《剑指offer》 第五章优化时间和空间效率 总结
在时间复杂度不能满足要求时,借助辅助空间。1. Partition函数方法是一种“从n个数字中查找第k大数字”的较好的方法,其复杂度是O(N),缺点是会改变原来的数组;2. 学会并熟悉STL中常见的函数模板和容器,如set、multiset、unordered_set、qsort等3. 如果需要判断多个字符是否在某个字符串中出现过或者统计多个字原创 2014-02-13 00:51:23 · 865 阅读 · 0 评论 -
操作系统、计算机网络、设计模式
基础篇:操作系统、计算机网络、设计模式一:操作系统1. 进程的有哪几种状态,状态转换图,及导致转换的事件。2. 进程与线程的区别。3. 进程通信的几种方式。4. 线程同步几种方式。(一定要会写生产者、消费者问题,完全消化理解)5. 线程的实现方式. (也就是用户线程与内核线程的区别)6. 用户态和核心态的区别。7. 用户栈和内核栈的区转载 2014-09-17 15:53:40 · 1099 阅读 · 0 评论 -
快速寻找满足条件的两个数
快速寻找满足条件的两个数扩展问题:1. 输入两个整数 n和 m,从数列1,2,3.......n中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来。2. 从一列数中筛除尽可能少的数使得从左往右看,这些数是从小到大再从大到小的(网易)。3. 以上可参见http://blog.csdn.net/wxl3105/article/de原创 2014-09-21 22:33:07 · 627 阅读 · 0 评论 -
逆波兰式
让计算机处理同化成那个的原创 2014-09-21 22:12:15 · 712 阅读 · 0 评论 -
KMP算法
// 0919.cpp : 定义控制台应用程序的入口点。#include "stdafx.h"#include using namespace std;void getnext(char* dnt,int* next,int num)//dnt对应的next向右移一位{ if ((dnt==NULL)||(next==NULL)||(num<1)) return; int i=0原创 2014-09-25 16:42:56 · 593 阅读 · 0 评论 -
Manacher算法--O(n)回文子串算法
这里,我介绍一下O(n)回文串处理的一种方法。Manacher算法. 首先:大家都知道什么叫回文串吧,这个算法要解决的就是一个字符串中最长的回文子串有多长。这个算法可以在O(n)的时间复杂度内既线性时间复杂度的情况下,求出以每个字符为中心的最长回文有多长, 这个算法有一个很巧妙的地方,它把奇数的回文串和偶数的回文串统一起来考虑了。这一点一直是在做回文串问题中时比较烦的地方。这个转载 2014-10-15 15:06:58 · 644 阅读 · 0 评论 -
八叉树 Octree
(一)基本原理 用八叉树来表示三维形体,并研究在这种表示下的各种操作及应用是在进入80年代后才比较全面地开展起来的。这种方法,既可以看成是四叉树方法在三维空间的推广,也可以认为是用三维体素阵列表示形体方法的一种改进。 八叉树的逻辑结构如下: 假设要表示的形体V可以放在一个充分大的正方体C内,C的边长为2 n,形体V C,它的八叉树可以用以下的递归方法来定义转载 2013-08-09 15:11:24 · 1886 阅读 · 0 评论 -
数据结构之(链表)代码
LinkNode.h#include "stdafx.h"typedef int elemtype;//int可以换成任意基本数据类型typedef struct lnode//链表结点{ elemtype data; struct lnode *next; int length;}lnode;lnode *create_list();//创建链表void out_lis原创 2013-09-08 15:45:11 · 980 阅读 · 0 评论 -
数据结构之(二叉树)代码
//"bitreenode.h"中#include "stdafx.h"#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define OVERFLOW 1#define MAXSIZE 100 #define ClearBiTree DestroyBiTreetypedef char TElemType;typed原创 2013-09-03 21:56:11 · 799 阅读 · 1 评论 -
数据结构之(堆排序)
1. 什么是堆?它具有如下性质1) 它是个完全二叉树2) 每个节点的值都大于或等于左右孩子节点的值是大顶堆3) 每个节点的值都小于或等于左右孩子节点的值是小顶堆4) 具有N个节点的树建立堆时间复杂度为O(N)2. 堆排序算法?其基本思想是:将待排序的序列构造成一个大顶堆。此时,整个序列的原创 2013-10-12 22:35:29 · 738 阅读 · 0 评论 -
数据结构(之)动态规划总结
一、 动态规划的实现步骤1. 找出问题的最优子结构1) 寻找最优子结构时,可以遵循一种共同的模式:a) 问题对的一个解可以是做一个选择b) 假设对一个给定的问题,已知的是一个可以导致最优解的选择c) 在已知这个选择后,要确定哪些子问题会随之发生,以及如何最好的描述所得到的子问题空间d原创 2013-10-13 12:46:23 · 1160 阅读 · 0 评论 -
数据结构(之)KMP算法
// KMP_algorithm.cpp : Defines the entry point for the console application.//#include "stdafx.h"#includeusing namespace std;class KMP{private:public: //KMP(); void matchStr(char source[],原创 2013-10-13 22:38:57 · 552 阅读 · 0 评论 -
数据结构之(图之)深度遍历和广度遍历
深度遍历:从图中某个顶点v出发,访问此顶点,然后从v的未被访问的邻接点出发深度优先遍历图,直至图中所有和v有路径相通的顶点都被访问到。其更适合:目标比较明确,以找到目标为主要目的的情况。广度遍历:类似于树中的层序遍历,首先遍历完和某一顶点v相连的所有顶点,然后再遍历和这些顶点相连的顶点,以此类推。其更适合于:不断扩大遍历范围时找到相对最优解的情况。具体代码如下://原创 2013-10-25 15:02:22 · 1399 阅读 · 0 评论 -
数据结构之(图)之深度遍历及广度遍历
深度遍历:从图中某个顶点v出发,访问此顶点,然后从v的未被访问的邻接点出发深度优先遍历图,直至图中所有和v有路径相通的顶点都被访问到。其更适合:目标比较明确,以找到目标为主要目的的情况。广度遍历:类似于树中的层序遍历,首先遍历完和某一顶点v相连的所有顶点,然后再遍历和这些顶点相连的顶点,以此类推。其更适合于:不断扩大遍历范围时找到相对最优解的情况。具体代码如下://原创 2013-10-25 15:03:18 · 1146 阅读 · 0 评论 -
数据结构之(图存储结构之)邻接表
邻接表:适用范围:时间复杂度:具体程序如下:// CreateGraph_AdjacencyList.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include "stdio.h" #include "stdlib.h" #include原创 2013-10-24 20:18:40 · 936 阅读 · 0 评论 -
数据结构之(图之最小生成树)Kruskal(克鲁斯卡尔)算法
1)图最小生成树生成算法常用的有两种:Prim(普利姆)算法和Kruskal(克鲁斯卡尔)算法;2)Kruskal算法设计的精妙之处在于:a)将各个边按照权值的大小排序;b)检测新添加的边是否会和其它边组成回路的算法(其主要思想是,在将节点添加到最小生成树节点的过程中,节点会自动分成两个集合,如果新添加边的始端点经过循环和末端点重合,即说明会组成回路)3)其时间复杂度是:N*logN,其中原创 2013-10-26 12:50:15 · 1376 阅读 · 0 评论 -
数据结构之(动态规划一)之<装配线调度>
前言:动态规划的概念 动态规划(dynamic programming)是通过组合子问题的解而解决整个问题的。分治算法是指将问题划分为一些独立的子问题,递归的求解各个问题,然后合并子问题的解而得到原问题的解。例如归并排序,快速排序都是采用分治算法思想。本书在第二章介绍归并排序时,详细介绍了分治算法的操作步骤,详细的内容请参考:http://www.cnblogs.com/Anker/ar转载 2013-09-23 20:43:54 · 973 阅读 · 0 评论 -
数据结构之(图最短路径之)Dijkstra(迪杰斯特拉)算法
1)常用的图最短路径的算法有两个:Dijkstra算法和Floyd算法;2)Dijkstra算法适用于求图中两节点之间最短路径,Floyd算法适于求图中任意两节点间;3)两种算法的主要思想是动态规划,而Dijkstra算法设计比较巧妙的是:在求源节点到终结点自底向上的过程中,源节点到某一节点之间最短路径的确定上(这也是我之前苦于没有解决的地方),其解决方法是通过比较每次循环中源节点到各个节原创 2013-10-26 10:24:33 · 6047 阅读 · 0 评论 -
数据结构之(二叉排序树)
二叉排序树,又名二叉查找树;二叉排序树是一种用于快速的查询和删除某一元素时建立的数据存储结构;优点:建立后的树是规则的树,能够快速的(二分查找)查询和删除某一元素;缺点:平均时间复杂度是logn,当树以自大到小或自小至大的元素顺序进行填充时,复杂度为n,故进一步提出二叉平衡树。// -1156203886//BST.H#ifndef BST_H#define BST_H原创 2013-09-18 21:55:11 · 771 阅读 · 0 评论 -
《数据结构》之(散列表)
本章介绍了散列表(hash table)的概念、散列函数的设计及散列冲突的处理。散列表类似与字典的目录,查找的元素都有一个key与之对应,在实践当中,散列技术的效率是很高的,合理的设计散函数和冲突处理方法,可以使得在散列表中查找一个元素的期望时间为O(1)。散列表是普通数组概念的推广,在散列表中,不是直接把关键字用作数组下标,而是根据关键字通过散列函数计算出来的。书中介绍散列表非常注重推理和证明,转载 2013-09-11 10:43:28 · 1876 阅读 · 0 评论 -
数据结构之(平衡二叉树)
1)平衡二叉树是一种特殊的二叉排序树,是二叉排序树的一种优化方案2)其是为解决二叉排序树出现的树高度过大、栈开销大的情况而提出的3)优化后,树的高度会出现一种平衡的状态(树及子树分支的高度差不超过1),栈的开销大幅度减少;但是作为优化代价,在建树的过程中,每插入一个数值,都会判断插入的数值对整个树各个节点的平衡因子(balanced factor)做出检查从而快速的调整树为平衡树下面是原创 2013-09-20 19:55:18 · 792 阅读 · 0 评论 -
数据结构之(快速排序)代码
// sort.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include using namespace std;void swap_var(float l[],int low,int high);int Partition(float l[],int low, int high);void QSort(float l[],int low,原创 2013-09-03 18:37:02 · 954 阅读 · 0 评论 -
数据结构之(图最短路径之)Floyd(弗洛伊德)算法
1)弗洛伊德算法是求图最短路径的另外一种算法,其适用于求图中任意两节点之间最短路径;2)其基本思想也是动态规划,时间复杂度是O(N^3),N代表节点个数;3)动态规划的实现步骤是:a)找出问题的最优子结构;b)根据最优子结构求出递归解;c)以自下而上的方式求出最优解;d)解出最优解的最优路径;其难点往往是在b)环节,解决了b)环节,其它环节都是很好实现的;4)图在运用动态规划的时候难点原创 2013-10-26 10:55:14 · 4658 阅读 · 0 评论 -
数据结构之(动态规划二)之<矩阵链乘法>
1、矩阵乘法 从定义可以看出:只有当矩阵A的列数与矩阵B的行数相等时A×B才有意义。一个m×r的矩阵A左乘一个r×n的矩阵B,会得到一个m×n的矩阵C。在计算机中,一个矩阵说穿了就是一个二维数组。一个m行r列的矩阵可以乘以一个r行n列的矩阵,得到的结果是一个m行n列的矩阵,其中的第i行第j列位置上的数等于前一个矩阵第i行上的转载 2013-09-23 22:38:59 · 1145 阅读 · 1 评论 -
数据结构之(动态规划)之最长公共序列
1、基本概念 一个给定序列的子序列就是该给定序列中去掉零个或者多个元素的序列。形式化来讲就是:给定一个序列X={x1,x2,……,xm},另外一个序列Z={z1、z2、……,zk},如果存在X的一个严格递增小标序列1,i2……,ik>,使得对所有j=1,2,……k,有xij = zj,则Z是X的子序列。例如:Z={B,C,D,B}是X={A,B,C,B,D,A,B}的一个子序列,相应转载 2013-09-26 22:22:41 · 707 阅读 · 0 评论 -
蓄水池抽样——《编程珠玑》读书笔记
问题:如何随机从n个对象中选择一个对象,这n个对象是按序排列的,但是在此之前你是不知道n的值的。 思路:如果我们知道n的值,那么问题就可以简单的用一个大随机数rand()%n得到一个确切的随机位置,那么该位置的对象就是所求的对象,选中的概率是1/n。 但现在我们并不知道n的值,这个问题便抽象为蓄水池抽样问题,即从一个包含n个对象的列表S中随机选取k个对象转载 2014-10-31 14:21:16 · 660 阅读 · 0 评论