算法导论
文章平均质量分 63
qq_2773878606
学生
展开
-
统计0到n之间1的个数
问题描述给定一个十进制整数N,求出从1到N的所有整数中出现”1”的个数。 例如:N=2时 1,2出现了1个 “1” 。N=12时 1,2,3,4,5,6,7,8,9,10,11,12。出现了5个“1”。1、暴力求解法//暴力求解long CountOnes(long n){ int i,j;//循环变量 int ncount=0;//计数 for原创 2016-07-27 22:26:11 · 805 阅读 · 0 评论 -
二叉树的建立
#includeusing namespace std;typedef struct node{ char data; struct node * leftchild; struct node* rightchild;}Node,*Bitree;void creatbitree(Bitree &T){ char c; cin >> c; if ('#' == c) T原创 2015-08-29 22:33:21 · 470 阅读 · 0 评论 -
链式单链表
#include "stdio.h" #include "string.h"#include "ctype.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h"#define OK 1#define ERROR 0#define TRUE 1#define原创 2015-08-31 20:24:18 · 348 阅读 · 0 评论 -
顺序链表(数组形式)
#include#define MAX 20using namespace std;typedef struct node{ int data[MAX]; int length;}sqlist;void initial(sqlist* s){ s->length = 0;}bool listempty(sqlist* s){ if (s->length == 0)原创 2015-08-31 19:45:32 · 355 阅读 · 0 评论 -
求n!中含有某个因子个数的方法
求n的阶乘某个因子a的个数,如果n比较小,可以直接算出来,但是如果n很大,此时n!超出了数据的表示范围,这种直接求的方法肯定行不通。其实n!可以表示成统一的方式。n!=(k^m)*(m!)*a 其中k是该因子,m=n/k,a是不含因子k的数的乘积下面推导这个公式n!=n*(n-1)*(n-2)*......3*2*1 =(k*2k*3k.....*mk)*a a是转载 2015-08-31 10:50:23 · 506 阅读 · 0 评论 -
利用非递归方法实现二叉树的中序遍历
#include#include#define N 7using namespace std;typedef struct node{ struct node *leftChild; struct node *rightChild; int data;}BiTreeNode, *BiTree;// 生成一个结点BiTreeNode *createNode(int i){转载 2015-08-30 09:57:29 · 445 阅读 · 0 评论 -
利用非递归方法实现二叉树的先序遍历
#include#include#define N 7using namespace std;typedef struct node{ struct node *leftChild; struct node *rightChild; int data;}BiTreeNode, *BiTree;// 生成一个结点BiTreeNode *createNode(int i){转载 2015-08-30 09:55:21 · 518 阅读 · 0 评论 -
求二叉树中叶子结点的个数
#include#define N 63using namespace std;char str[] = "ab#d##c#e##";int i = -1;typedef struct node{ struct node *leftChild; struct node *rightChild; char data;}BiTreeNode, *BiTree;//生成一个转载 2015-08-30 10:04:36 · 1058 阅读 · 0 评论 -
在二叉树中找值为x的结点(假设所有结点的值都不一样)
#include#include#define N 7using namespace std;typedef struct node{ struct node *leftChild; struct node *rightChild; int data;}BiTreeNode, *BiTree;// 生成一个结点BiTreeNode *createNode(int i){原创 2015-08-30 09:59:56 · 822 阅读 · 0 评论 -
二叉树的建立
#include#define N 7using namespace std;typedef struct node{ struct node* leftchild; struct node* rightchild; int data;}Node,*Bitree;//建立一个节点Node * creatnode(int i){ Node* p = new Node; p原创 2015-08-29 22:12:27 · 561 阅读 · 0 评论 -
求二叉树的高度
这个程序在二叉树层次遍历的递归实现中曾用到过,程序如下:[cpp] view plaincopy#include #include #define N 7 using namespace std; typedef struct node { struct node *leftChild;转载 2015-08-30 10:01:45 · 447 阅读 · 0 评论 -
链栈的建立、判空、入栈、出栈、求长、访顶、清空和销毁
#includeusing namespace std;typedef struct node{ int data; struct node*next;}Node, *stack;//初始化栈void initialsatck(stack &s){ s = new Node; s->next = NULL;}//判断栈是不是空的bool isempty(stack &原创 2015-08-29 21:44:44 · 4869 阅读 · 0 评论 -
用递归方法对二叉树进行先序、中序和后序遍历
二叉树为: 1 2 3 4 5 6 7 程序如下:[cpp] view plaincopy#include #de转载 2015-08-30 09:52:10 · 682 阅读 · 0 评论 -
两个栈来实现一个队列的C++代码
#include #include using namespace std;// 用两个stack实现一个queue, 以int类型为例吧class MyQueque{private: stack s1; // s1负责入队 stack s2; // s2负责出队 public: // 入队 void push(int x) { s1.push(x); }转载 2015-08-30 10:27:05 · 461 阅读 · 0 评论 -
关联容器
关联容器的类型: map:关联数组;元素通过键来从存储读取set:大小可变的集合,至此后通过建实现快速读取multimap:支持同一个键多次出现的map类型multiset:支持同一个键多次出现的set类型一般来说,如果希望有效地存储不同值的集合,那么使用set比较合适,而map容器则更适用于需要存储乃至修改每个键所干练的值的情况。在做某种文本处理时,可转载 2015-11-29 22:28:30 · 312 阅读 · 0 评论 -
hash表
hash表,有时候也被称为散列表。个人认为,hash表是介于链表和二叉树之间的一种中间结构。链表使用十分方便,但是数据查找十分麻烦;二叉树中的数据严格有序,但是这是以多一个指针作为代价的结果。hash表既满足了数据的查找方便,同时不占用太多的内容空间,使用也十分方便。 打个比方来说,所有的数据就好像许许多多的书本。如果这些书本是一本一本堆起来的,就好像链表或者线性表一样,整个数据会显转载 2015-11-29 22:21:31 · 264 阅读 · 0 评论 -
string实现
#includeusing namespace std; class String{ friend ostream& operator<< (ostream&,String&);public: String(const char* str=NULL); //赋值构造兼默认构造函数(char) String(const String &o转载 2015-11-29 22:24:54 · 260 阅读 · 0 评论 -
顺序容器
容器类共享公共的接口,这使标准库更容易学习,只要学会其中一种类型就能运用令一种类型,每种容器类型提供一种不同的时间和功能折中方案,通常不需要修改代码,只需改变类型声明,用一种容器类型代替另一容器类型就可以优化程序的性能。 容器容纳特定类型对象的集合,它将单一类型元素聚集起来成为容器。然后根据位置来存储和访问这些元素,这就是顺序容器。 标准库定义 了三种顺序容器类型vec转载 2015-11-29 22:25:43 · 268 阅读 · 0 评论 -
模拟退火算法
模拟退火算法是用来求解最优化问题的算法。比如著名的TSP问题,函数最大值最小值问题等等。接下来将以如下几个方面来详细介绍模拟退火算法。 Contents 1. 模拟退火算法认识 2. 模拟退火算法描述 3. 费马点问题求解 4. 最小包含球问题求解 5. 函数最值问题求解 6. TSP问题求解转载 2015-12-14 10:21:14 · 546 阅读 · 0 评论 -
KMP字符串模式匹配详解
KMP字符串模式匹配详解KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法。简单匹配算法的时间复杂度为O(m*n);KMP匹配算法。可以证明它的时间复杂度为O(m+n).。一.简单匹配算法先来看一个简单匹配算法的函数:int Index_BF ( char S [ ], char T [ ], int pos ){/* 若串 S 中从第po转载 2015-11-23 16:53:32 · 497 阅读 · 0 评论 -
背包问题
题意:给定两串数字,有正有服,求出最大和,且这个和的状态下满足任一边都不为负。思路:dp。说是背包,但是其实完全不懂背包的也可以做出来。本质就是用dp数组来记录状态,然后依次增加状态和更新而已。。值得注意的就是对负值平移成非负的。[cpp] view plaincopy转载 2015-09-04 11:38:15 · 349 阅读 · 0 评论 -
贪心算法
题意: 给定一个数字串,按奇偶顺序挑选几个数字,+奇选的数字-偶选的数字,问怎样顺序挑选使最后的和最大。思路:O(n)贪心。本质上其实是在对这个串进行分割,分割成若干段,每个段里面有一个最大值,一个最小值,且最大值在最小值前面。O(N)去遍历,先找出最大值,然后找出最小值,就算完成一个子段。至于最后的子段肯定是只有最大值,所以只需在读取的转载 2015-09-04 11:36:25 · 333 阅读 · 0 评论 -
大数的四则运算
在处理大数的运算时,一般采用数组去模拟,下面介绍大数的加、减、乘、除四则运算的实现方法。1.加法。 如: Input: 123456789123456789123456789 1 Output:123456789123456789123456790 输入采用字符数组保存,然后将输入存在整形数组里,然后逐位相加即可,同时注意进位处理。#inc转载 2015-08-31 10:49:56 · 367 阅读 · 0 评论 -
整数划分问题(续)(非递归法)
上一篇讨论的是整数划分问题递归方法,下面来讨论下非递归方法:一般情况下,遇到递归问题,若能直接求得递推式,则可以很容易用数组模拟来实现递归,根据已经得出的递归关系,可以设置一个二维数组S[][]来存储数据:for(i=1;i<=n;i++){ S[i][1]=1; S[1][i]=1;}for(i=2;i<=n;i++){ for(j=2;j<=m;j+转载 2015-08-31 10:49:15 · 555 阅读 · 0 评论 -
分解 n!
给你一个数 n (1 < n <= 1000000) ,求 n! (n的阶乘)的质因数分解形式,质因数分解形式为n=p1^m1*p2^m2*p3^m3……* 这里 p1 < p2 < p3 < …… 为质数* 如果 mi = 1, 则 ^ mi 就不需要输出 6=2^4*3^2*57=2^4*3^2*5*7 题意:给出n,将n!分解成质因子相乘的形式。 在这里如转载 2015-08-31 10:48:42 · 820 阅读 · 0 评论 -
双链表的建立、求长、定位、插入、删除、输出和释放
#includeusing namespace std;typedef struct node{ int data; struct node *next, *prior;}Node,*Dlist;//创建爽链表,循环的,呈现环状Dlist creatDlist(){ int num; Node *head, *p1, *p2; head = new Node; p1 =原创 2015-08-29 19:02:50 · 590 阅读 · 0 评论 -
整数划分问题(递归法)
整数划分问题是算法中的一个经典命题之一,有关这个问题的讲述在讲解到递归时基本都将涉及。所谓整数划分,是指把一个正整数n写成如下形式: n=m1+m2+...+mi; (其中mi为正整数,并且1 如果{m1,m2,...,mi}中的最大值不超过m,即max(m1,m2,...,mi)例如但n=4时,他有5个划分,{4},{3,1},{2,2},{2,1,1},{1,1,1,1};转载 2015-08-30 11:06:15 · 518 阅读 · 0 评论 -
return 函数
return 表示从被调函数返回到主调函数继续执行,返回时可附带一个返回值,由return后面的参数指定。 return通常是必要的,因为函数调用的时候计算结果通常是通过返回值带出的。 如果函数执行不需要返回计算结果,也经常需要返回一个状态码来表示函数执行的顺利与否(-1和0就是最常用的状态码),主调函数可以通过返回值判断被调函数的执行情况。中文名return解转载 2015-08-28 15:42:05 · 1383 阅读 · 0 评论 -
随机快速排序
在快速排序中每次对数组的分界操作Partition都是以数组的末位点作为分界点(key),这样就带来了一个问题——当待排序数组是一个已排好序的数组时,快速排序的执行时间是O(n平方),在执行 时间上比较耗时,于是就有了随机快速排序的思想。 在随机快速排序中,每次对数组的分界操作Partition都是在数组中随机寻找一个元素作为分界点(key),这样就避免了上诉问题,随机排序的平均在执行时原创 2015-07-28 20:46:03 · 469 阅读 · 0 评论 -
红黑树
一 红黑树的定义算法导论里是这样定义一棵红黑树的: 1、每个结点或是红色的,或是黑色的 2、根节点是黑色的 3、每个叶结点(NIL)是黑色的 4、如果一个节点是红色的,则它的两个儿子都是黑色的。 5、对于每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑色结点。 话说这些性质里面,前四个都很容易理解,转载 2015-07-19 15:47:39 · 514 阅读 · 0 评论 -
查找数组中第二个最小元素
查找数组中最小的两个元素的过程:第一种情况:如果数组的数据是偶数个N:1、首先假设最小值和次最小值是最前面的两个数min1=p[0];min2=p[1];2、进行循环,进入下一组的两个数中进行比较【3 4】中对比如果第三个数小于第四个数那个第三个数跟min1 和min2的数进行比较,重新分配最小值和次最小值与之雷同第三个数大于第四个数时,一样的操作,原创 2015-08-09 15:24:12 · 930 阅读 · 0 评论 -
栈 链表的实现
链表是数据结构,按线性顺序排列,每个对象都有一个关键字和指针,定义一个栈的链表typedef struct Stack{ int nValue; struct Stack *pNext; }Stack, *PStack;然后创建一个栈链表的话,首先先开辟相应的存储空间,给对象赋予相应的值;PStack CreateStack(){原创 2015-08-09 19:23:23 · 373 阅读 · 0 评论 -
随机查找数组中第i个元素(按顺序排列的)
在一个无序的序列中,要查找第i小的元素最简单的方法就是将所有元素排序,就可以直接找到地i小的元素,然而比较排序算法最快也只能是O(nlogn),比如堆排序、归并排序、快速排序。这里研究了只要时间复杂度为O(n)的算法。 利用快速排序算法中的枢轴元素,即枢轴元素的左边全是小于等于它的元素,枢轴元素的右边全是大于等于它的元素,则枢轴元素的位置k就是它在序列中第k小的元素,然后用k和原创 2015-08-09 17:43:58 · 1042 阅读 · 0 评论 -
同时查找数组中最大和最小值
查找数组中的最大值和最小值有下面的方法:1、按照普通的方法进行查找,分别写出找到数组中最大值函数和最小值函数,这种方法很简单:代码如下:int Min(int *pnArr, int nLen){ int nMin = pnArr[0]; for (int i = 1; i < nLen; i++) { if (nMin > pnArr原创 2015-08-09 15:33:27 · 1600 阅读 · 0 评论 -
数据结构-----栈
1.栈1.1 栈的定义栈是一种特殊的线性表。其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行。如下所示:结论:后进先出(Last In First Out),简称为LIFO线性表。栈的基本运算有六种:构造空栈:InitStack(S)、判栈空: StackEmpty(S)、判栈满: StackFull转载 2015-08-09 19:11:55 · 343 阅读 · 0 评论 -
递归算法详细分析
递归主要的是每次递归一次,就创建一个存储空间,就是栈,因为函数调用时,当调用完函数时,接下来回运行函数下面的语句,对于递归来说,每个栈中都调用了函数,当递归结束后,得运行函数后面的语句,就是指在每个栈中都要运行函数后面的语句,直到栈为空为止,这里有一个简单的程序,可用于说明递归。程序的目的是把一个整数从二进制形式转换为可打印的字符形式。例如:给出一个值4267,我们需要依次产生字符转载 2015-07-28 17:20:22 · 419 阅读 · 0 评论 -
雇佣问题
考虑一个雇佣问题:你是一个老板,向猎头公司委托寻找一个秘书职位,猎头每天为你推荐一个应聘者,而你对他进行面试。你的目标是,任 用所有应骋者中资质最好的。但由于秘书职位不能空缺,在每次面试完后,都要立即给面试者结果,所以只要当天的面试者资质比现任秘书好,你就解雇现任的秘 书,而重新雇佣当天的应骋者。下面给出面试n个人的伪代码:HIRE_ASSISTANT(n) {1原创 2015-07-27 16:43:26 · 633 阅读 · 0 评论 -
随机排列问题
随机排列数组:1)PERMUTE-BY-SORTING(A)为数组的每个元素赋一个随机的优先级,然后根据优先级对数组A进行排序。PERMUTE-BY-SORTING(A)1 n ← length[A]2 for i ← 1 to n3 do P[i] = RANDOM(1, n3)4 sort A, using P as sort ke原创 2015-07-27 16:54:34 · 443 阅读 · 0 评论 -
计数排序
基本思想假设数序列中小于元素a的个数为n,则直接把a放到第n+1个位置上。当存在几个相同的元素时要做适当的调整,因为不能把所有的元素放到同一个位置上。计数排序假设输入的元素都是0到k之间的整数。回到顶部参考代码#include void COUNTINGSORT(int *A, int *B, int array_size, int k){转载 2015-08-01 22:26:01 · 476 阅读 · 0 评论 -
归并排序
归并排序算法 “归并”一词的中文含义就是合并、并入的意思,而在数据结构中的定义是将两个或两个以上的有序表组合成一个新的有序表。 归并排序(Merging Sort)就是利用归并的思想实现的排序方法。它的原理是假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,再两两归并,……,如此重复,直至得到一个长度为n的有序序列为止,转载 2015-07-28 18:08:51 · 438 阅读 · 0 评论