算法
yofer张耀琦
我喜欢自己开朗的性格
展开
-
生成1~n的排列,以及生成可重集的排列
#include using namespace std;void printPermutation(int n, int* A, int cur){ if (cur == n) { // 递归边界 for (int i = 0; i < n; i++) { printf("%d ", A[i]); } printf("\n"); } else { for (i原创 2015-06-20 22:17:06 · 764 阅读 · 0 评论 -
栈应用 - 后缀表达式的计算
有关栈API详情参看我的另一篇博文: 栈的链式存储 - API实现遍历后缀表达式中的数字和符号对于数字:进栈对于符号:从栈中弹出右操作数从栈中弹出左操作数根据符号进行运算将运算结果压入栈中遍历结束:栈中的唯一数字为计算结果#include #include "LinkStack.h"int isNumber3(char c){ return ('0'原创 2015-07-13 19:48:54 · 1221 阅读 · 0 评论 -
栈的应用 - 就近匹配
链式存储栈的API详情参看我的博文:栈的链式存储 - API实现就近匹配 几乎所有的编译器都具有检测括号是否匹配的能力如何实现编译器中的符号成对检测?#include int main() { int a[4][4]; int (*p)[4]; p = a[0]; return 0;算法思路从第一个字符开始扫描当遇见普通字符时忽略,当遇见左符号时压入栈中当遇原创 2015-07-13 17:12:21 · 834 阅读 · 0 评论 -
队列顺序存储 - 设计与实现 - API函数
队列是一种特殊的线性表 队列仅在线性表的两端进行操作队头(Front):取出数据元素的一端队尾(Rear):插入数据元素的一端队列不允许在中间部位进行操作!queue常用操作销毁队列清空队列进队列出队列获取队头元素获取队列的长度队列也是一种特殊的线性表;可以用线性表顺序存储来模拟队列。主要代码:// seqqueue.h// 顺原创 2015-07-16 13:39:17 · 891 阅读 · 0 评论 -
队列链式存储 - 设计与实现 - API函数
队列相关基础内容参我的博文: 队列顺序存储 - 设计与实现 - API函数队列也是一种特殊的线性表;可以用线性表链式存储来模拟队列的链式存储。主要代码:// linkqueue.h// 队列链式存储API声明#ifndef _LINKQUEUE_H_#define _LINKQUEUE_H_typedef void LinkQueue;// 创建队列LinkQue原创 2015-07-16 14:30:12 · 928 阅读 · 0 评论 -
树的3种表示法
// 二叉树表示法typedef struct BiTNode{ int data; struct BiTNode *lchild, *rchild;}BiTNode, *BiTree;// 三叉链表表示法typedef struct TriTNode{ int data; // 左右孩子指针 TriTNode *lchild, *rchild; // 父指针 T原创 2015-07-18 16:12:44 · 1943 阅读 · 0 评论 -
二叉树的遍历本质 - 前序,中序,后序
遍历算法的访问路径是相同的,只是访问结点的时机不同原创 2015-07-18 20:59:55 · 964 阅读 · 0 评论 -
计算二叉树叶子结点,加深理解遍历的本质
// 1递归函数遇到全局变量,最好转化成函数参数// 2遍历的本质强化// 访问树的路径是相同,只不过是计算叶子结点的时机不同。原创 2015-07-18 21:19:35 · 700 阅读 · 0 评论 -
求二叉树深度和copy二叉树
// operatorTree.cpp// 对树的操作#include #include // 二叉树表示法typedef struct BiTNode{ int data; struct BiTNode *lchild, *rchild;}BiTNode, *BiTree;// 中序遍历void inOrder(BiTNode *T){ if (T == NULL原创 2015-07-18 22:02:07 · 686 阅读 · 0 评论 -
树的非递归遍历(中序遍历)
中序 遍历的几种情况分析1:什么时候访问根、什么时候访问左子树、什么访问右子树 当左子树为空或者左子树已经访问完毕以后,再访问根 访问完毕根以后,再访问右子树。分析2:非递归遍历树,访问结点时,为什么是栈,而不是其他模型(比如说是队列)。 先走到的后访问、后走到的先访问,显然是栈结构分析3:结点所有路径情况步骤1:如果结点有左子原创 2015-07-18 22:58:23 · 753 阅读 · 0 评论 -
创建树 - #号法
#创建树,让树的每一个节点都变成度数为2的树通过先序遍历124###3##可以唯一确定一棵树。// nonrecursion.cpp// 对树的操作#define _CRT_SECURE_NO_WARNINGS#include #include #include using namespace std;// 二叉树表示法typedef struct BiTNode原创 2015-07-19 18:37:54 · 2259 阅读 · 1 评论 -
线索化 - 遍历思想,流程,代码
1、前言普通二叉树只能找到结点的左右孩子信息,而该结点的直接前驱和直接后继只能在遍历过程中获得。若可将遍历后对应的有关前驱和后继预存起来,则从第一个结点开始就能很快“顺藤摸瓜”而遍历整个树了。二叉线索树思想是干什么的?中序遍历这棵树===》转换成链表访问2线索化思想结论:线索化过程就是在遍历过程(假设是中序遍历)中修改空指针的原创 2015-07-19 20:29:46 · 963 阅读 · 0 评论 -
队列类 - 链式存储
代码:// linkqueue.hpp// 队列类#pragma once#include "linklist.hpp"template class LinkQueue{public: LinkQueue(); ~LinkQueue();public: int clear(); int append(T &t); int retieve(T &t); int原创 2015-07-20 15:01:18 · 583 阅读 · 0 评论 -
栈类 - 链式存储
代码:// linkstack.hpp// 栈类#pragma once#include "linklist.hpp"template class LinkStack{public: LinkStack(); ~LinkStack();public: int clear(); int push(T &t); int pop(T &t); int top(T &原创 2015-07-20 14:27:56 · 651 阅读 · 0 评论 -
海量数据处理 - 10亿个数中找出最大的10000个数(top K问题)
前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去鹅场的心已经按捺不住了),这个问题还是建立最小堆比较好一些。 先拿10000个数建堆,然后一次添加剩余元素,如果大于堆顶的数(10000中最小的),将这个数替换堆顶,并调整结构使之仍然是一个最小堆,这样,遍历完后,堆中的10000个数就是所需的最大的10000个。建堆原创 2015-08-16 00:09:54 · 119323 阅读 · 30 评论 -
程序员编程艺术:第三章续、Top K算法问题的实现
程序员编程艺术:第三章续、Top K算法问题的实现 作者:July,zhouzhenren,yansha。 致谢:微软100题实现组,狂想曲创作组。 时间:2011年05月08日 微博:http://weibo.com/julyweibo 。 出处:http://blog.csdn.net/v_JULY_v 。 wiki:http转载 2015-08-18 09:51:30 · 1330 阅读 · 0 评论 -
栈的应用 - 中缀表达式转后缀表达式
有关栈API详情请参看我的另一篇博文:栈的链式存储 - API实现实例:5 + 4=> 5 4 + 1 + 2 * 3 => 1 2 3 * + 8 + ( 3 – 1 ) * 5 => 8 3 1 – 5 * + 中缀表达式符合人类的阅读和思维习惯后缀表达式符合计算机的“运算习惯”中缀转后缀算法:遍历中缀表达式中的数字和符号对于数字:直接输出对于符号:原创 2015-07-13 19:44:57 · 820 阅读 · 1 评论 -
从头到尾解析Hash表算法
via:点击打开链接 十一、从头到尾解析Hash 表算法作者:July、wuliming、pkuoliver 出处:http://blog.csdn.net/v_JULY_v。 说明:本文分为三部分内容, 第一部分为一道百度面试题Top K算法的详解;第二部分为关于Hash表算法的详细阐述;第三部分为打造一个最快的Hash表算转载 2015-09-10 20:52:51 · 752 阅读 · 0 评论 -
栈的顺序存储 - 设计与实现 - API实现
Stack基本概念栈是一种 特殊的线性表 栈仅能在线性表的一端进行操作栈顶(Top):允许操作的一端栈底(Bottom):不允许操作的一端Stack的常用操作创建栈销毁栈清空栈进栈出栈获取栈顶元素获取栈的大小 栈模型和链表模型关系分析栈的顺序存储设计与实现// seqlist.h// 顺序存储结构线性原创 2015-07-13 13:37:49 · 1211 阅读 · 0 评论 -
栈的链式存储 - API实现
基本概念其他概念详情参看前一篇博文:栈的顺序存储 - 设计与实现 - API实现这里也是运用了链表的链式存储API快速实现了栈的API。代码:// linkstack.h// 链式存储栈的API声明#ifndef _MY_LINKSTACK_H_#define _MY_LINKSTACK_H_typedef void LinkStack;// 创建栈L原创 2015-07-13 15:51:45 · 1380 阅读 · 0 评论 -
最大自序和问题
最大自序和问题。给出一个长度为n的序列求最大连续和。换句话说,要求找到1尽量大。使用枚举,demo1 tot = 0; best = A[i]; for (int i = 1; i <= n; i++) { for (int j = i; j <= n; j++) { // 检查连续子序列A[i]~A[j] int sum = 0; for (i原创 2015-06-20 23:51:56 · 795 阅读 · 0 评论 -
30000以内质数表
30000以内质数表,有时候做题打表用原创 2015-06-25 11:27:08 · 4320 阅读 · 0 评论 -
八皇后问题
介绍了八皇后问题的回溯法,并进行了效率优化原创 2015-06-25 10:16:22 · 757 阅读 · 0 评论 -
埃及分数问题 - 迭代加深搜索经典问题
在古埃及,人们使用单位分数的和(即1/a, a是自然数)表示一切有理数。例如2/3 = 1/2 + 1/6,但不允许2/3 = 1/3 + 1/3,因为在加数中不允许有相同的。对于一个分数a/b,表示方法有很多种,其中加数少的比加数多的好,如果加数个数相同,则最小的分数越大越好。例如,19/45 = 1/5 + 1/6 + 1/18是最优方案。输入整数a,b(0 < a < b < 500),试编程计算最佳表达式。理论上可以用回溯法求解,但是如果用宽度优先遍历,连一层都拓展不完(因为每一层都是无限大原创 2015-06-30 19:49:57 · 827 阅读 · 0 评论 -
图论算法 有图有代码 万字总结 向前辈致敬
来自:NoMasp柯于旺 - CSDN博客链接:http://blog.csdn.net/nomasp/article/details/45827145图的定义背景知识看到这篇博客相信一开始映入读者眼帘的就是下面这幅图了,这就是传说中的七桥问题(哥尼斯堡桥问题)。在哥尼斯堡,普雷格尔河环绕着奈佛夫岛(图中的A岛)。这条河将陆地分成了下面4转载 2015-06-11 00:25:30 · 2380 阅读 · 0 评论 -
求10000以内质数(以前都是直接打表,现在问到怎么求,瞬间词穷了,还是应该搞懂)
用筛法求素数。简单介绍一下厄拉多塞筛法。厄拉多塞是一位古希腊数学家,他在寻找素数时,采用了一种与众不同的方法:先将2-N的各数写在纸上:在2的上面画一个圆圈,然后划去2的其他倍数;第一个既未画圈又没有被划去的数是3,将它画圈,再划去3的其他倍数;现在既未画圈又没有被划去的第一个数 是5,将它画圈,并划去5的其他倍数……依次类推,一直到所有小于或等于N的各数都画了圈或划去为止。这时,表中画了圈的以及未划去的那些数正好就是小于 N的素数。这很像一面筛子,把满足条件的数留下来,把不满足条件的数筛掉。由于这种原创 2015-07-02 21:24:36 · 16809 阅读 · 0 评论 -
双向链表设计与API实现
为什么需要双向链表?单链表的结点都只有一个指向下一个结点的指针单链表的数据元素无法直接访问其前驱元素逆序访问单链表中的元素是极其耗时的操作!双向链表的定义在单链表的结点中增加一个指向其前驱的pre指针双向链表拥有单链表的所有操作创建链表销毁链表获取链表长度清空链表获取第pos个元素操作插入元素到位置pos删除位置pos处的元素原创 2015-07-12 20:03:37 · 714 阅读 · 0 评论 -
循环链表设计与API实现
基本概念循环链表的定义:将单链表中最后一个数据元素的next指针指向第一个元素循环链表拥有单链表的所有操作创建链表销毁链表获取链表长度清空链表获取第pos个元素操作插入元素到位置pos删除位置pos处的元素新增功能:游标的定义在循环链表中可以定义一个“当前”指针,这个指针通常称为游标,可以通过这个游标来遍历链表中的所有元素。循环链原创 2015-07-12 16:42:20 · 876 阅读 · 0 评论 -
C++链表模板类
思想和上篇文章差不多,只是换了层包装。直接上代码:// linklist.h#include #include using namespace std;template struct Node{ T t; Node *next;};template class LinkList{public: LinkList(); ~LinkList();publ原创 2015-07-11 23:03:13 · 5034 阅读 · 3 评论 -
排序 - 希尔排序(缩小增量排序)
排序过程:先取一个正整数d1 < n, 把所有相隔d1的记录放一组,每个组内进行直接插入排序;然后d2 < d1,重复上述分组和排序操作;直至di = 1,即所有记录放进一个组中排序为止。希尔排序是不稳定的。原创 2015-07-05 14:54:28 · 855 阅读 · 0 评论 -
排序 - 选择法
选择法基本思想,每一趟 (例如第 i 趟,i = 0, 1, …,n-2)在后面 n-i个待排的数据元素中选出关键字最小的元素, 作为有序元素序列的第 i 个元素。排序过程 首先通过n-1次关键字比较,从n个记录中找出关键字最小的记录,将它与第一个记录交换; 再通过n-2次比较,从剩余的n-1个记录中找出关键字次小的记录,将它与第二个记录交换;原创 2015-07-03 20:52:15 · 879 阅读 · 0 评论 -
排序 - 冒泡法(改进)
排序过程:将第一个记录的关键字与第二个记录的关键字进行比较,若为逆序r[1].key > r[2].key,则交换;然后比较第二个记录与第三个记录;依次类推,直至第n - 1个记录和第n个记录比较为止,第一趟冒泡排序,结果关键字最大的记录被安置在最后一个记录上。对前n - 1个记录进行第二趟冒泡排序,结果使关键字次大的记录被安置在第n - 1个记录位置。重复上述过程,直到“在一趟排序过原创 2015-07-04 15:00:44 · 743 阅读 · 0 评论 -
线性表的顺序存储设计和实现 - API函数实现
基本概念设计与实现插入元素算法判断线性表是否合法判断插入位置是否合法把最后一个元素到插入位置的元素后移一个位置将新元素插入线性表长度加1获取元素操作判断线性表是否合法判断位置是否合法直接通过数组下标的方式获取元素删除元素算法判断线性表是否合法判断删除位置是否合法将元素取出原创 2015-07-11 00:54:39 · 1194 阅读 · 0 评论 -
排序 - 插入法
基本思想:把一个个元素插入到有序序列中。排序过程:整个排序过程为n - 1趟插入,即先将序列中的第一个记录看成是一个有序子序列,然后从第2个记录开始,逐个进行插入,直至整个序列有序。实质:对线性表执行n - 1次插入操作,只是先要找到插入位置。V[0], V[1], …, V[i-1]已经排好序。这时,用V[i]的关键字与V[i-1], V[i-2], …的关键字进行比较, 找到插原创 2015-07-04 14:44:40 · 788 阅读 · 0 评论 -
线性表链式存储设计与实现 - API实现
基本概念链式存储定义为了表示每个数据元素与其直接后继元素之间的逻辑关系,每个元素除了存储本身的信息外,还需要存储指示其直接后继的信息。表头结点链表中的第一个结点,包含指向第一个数据元素的指针以及链表自身的一些信息数据结点链表中代表数据元素的结点,包含指向下一个数据元素的指针和数据元素的信息尾结点链表中的最后一个数据结点,其下一元素指针为空,表示无原创 2015-07-11 20:44:22 · 1021 阅读 · 0 评论 -
排序 - 快速排序
思想:快速排序是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,基准数据排在这两个子序列的中间;然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,一直达到整个数据变成有序序列。排序过程:对r[s...t]中记录进行一趟快速排序,附设两个指针 i 和 j ,设枢轴记录rp = r[s],x = rp.key初始时令i = s,j = t首先从j所指位置向前搜索第一个关键字小于x的记录,并和r原创 2015-07-05 20:11:30 · 525 阅读 · 0 评论 -
排序 - 归并排序
归并:将两个或两个以上的有序序列合并成一个新的有序序列,这种归并方法称为2路归并;将3个有序序列归并为一个新的有序序列,称为3路归并;将多个有序序列归并为一个新的有序序列,称为多路归并。合并过程:1、设置i,j 和 p 三个指针,其初值分别指向这三个记录区的起始位置;2、合并时依次比较R[i]和R[j]的关键字,取关键字较小的记录复制到R1[p]中;3、然后将被复制记录的指针 i 或 j 加1,以及指向复制位置的指针 p 加1;4、重复这一过程直至两个输入的子文件有一个已全部复制完毕(不妨称其原创 2015-07-06 10:27:20 · 546 阅读 · 0 评论 -
二分法小程序的问题
今天写这个小程序的时候把边界写错了,顺便说一下这个程序几个需要注意的点://首先要把握下面几个要点: //right=n-1 => while(left right=middle-1; //right=n => while(left right=middle; //middle的计算不能写在while循环外,否则无法得到更新。 int binary_search(原创 2015-09-14 20:16:20 · 592 阅读 · 0 评论