算法导论
文章平均质量分 71
李亚超
自强不息,厚德载物;
专注于Deep Learning, Machine Translation, NLP;
喜欢写关于Linux C/C ,C#,算法,自然语言处理的技术博客,欢迎观临;
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
八数码问题--用C#实现---VS2008可以执行
问题描述: 有一个3×3的棋盘,其中有0~8九个数字,0表示空格,其他的数字可以和0交换位置。求由初始状态到达目标状态步数最少的解。 解决八数码问题的常用方法为图搜索法,可用广度优先、深度优先和A*算法实现,其中A*算法又因估价函数的不同而有着不同的搜索时间。程序说明: 在本程序中,用广度优先、实现了八数码问题,目标状态默认为: 目标状态为: 2 8 3 1 2 3 1 0 4 7 8原创 2010-12-06 20:09:00 · 2668 阅读 · 0 评论 -
【算法导论】二叉查找树的操作C++实现
本代码为算法导论第12章中,伪代码的C++实现:#include #include using namespace std;/*二叉查找树结构*/typedef struct BSTree{ int node_value; struct BSTree * left; struct BSTree * right; struct BSTree * parent;}Tree;T原创 2012-10-15 11:11:03 · 1770 阅读 · 0 评论 -
【面试题精选】1-构造一个二叉查找树-C++实现
根据输入的数组元素,构造一个二叉查找树。#include using namespace std;/*二叉查找树结构*/typedef struct BSTree{ int node_value; struct BSTree * left; struct BSTree * right;}Tree;/*****构造二叉查找树*****************************原创 2012-09-26 10:48:12 · 1206 阅读 · 0 评论 -
算法导论答案汇总
本文汇总网上的算法导论答案,不断更新,希望对大家有所帮助。第22章22.1-5 平方图22.1-6 通用的汇22.2-6 好选手和坏选手问题 问题说明 解决方案22.2-7 树的直径 代码和证明 网易面试题22.4-2 s到t的通路数目22.4-3 无向图是否包含回路原创 2012-11-14 10:49:25 · 6593 阅读 · 0 评论 -
【算法导论】22.7 无向图的广度优先搜索--C++实现
这是用无向图的广度优先搜索代码,如果是有向图需要稍微修改,否则产生死循环。邻接矩阵表示的无向图的广度优先搜索:#include #include #include using namespace std;#define N 6#define INFINITE 0x7fffffff#define WHITE 1#define GRAY 2#define BLACK 3原创 2012-11-15 10:33:03 · 3418 阅读 · 0 评论 -
【算法导论】22.3 图的深度优先搜索-C++实现
本程序是用邻接表表示的图的深度优先搜索,为算法导论22.3伪代码的C++实现。对于有向图可以得到正确的结果,对于无向图貌似也可以得到遍历结果,代码如下:#include using namespace std;#define N 6#define INFINITE 0x7fffffff#define WHITE 1#define GRAY 2#define BLACK 3原创 2012-11-15 21:49:18 · 5595 阅读 · 2 评论 -
【算法导论】22.1 图的转置
用邻接表表示的图的转置算法,比较简单。#include using namespace std;#define N 8#define INFINITE 0x7fffffff#define WHITE 1#define GRAY 2#define BLACK 3//顶点结点结构 struct Vertex { Vertex * next;/*指向下一个顶点*/原创 2012-11-18 22:02:05 · 2437 阅读 · 1 评论 -
【算法导论】22.2-7 树的直径问题
树的直径是指树的最长简单路。求法: 两遍BFS :先任选一个起点BFS找到最长路的终点,再从终点进行BFS,则第二次BFS找到的最长路即为树的直径;原理: 设起点为u,第一次BFS找到的终点v一定是树的直径的一个端点证明: 1) 如果u 是直径上的点,则v显然是直径的终点(因为如果v不是的话,则必定存在另一个点w使得u到w的距离更长,则于BFS找到了v矛盾) 2) 如果原创 2012-11-19 09:27:34 · 4633 阅读 · 0 评论 -
【算法导论】24.3 Dijkstra算法
算法导论24.3章中算法的C++实现,代码如下:/******************************************************************** * Copyright (C) 2012 Li Yachao * Contact: liyc7711(at)gmail.com * * Permission to use, copy, m原创 2012-11-19 16:37:30 · 3222 阅读 · 0 评论 -
【算法导论】24.1 Bellman-Ford 算法
本代码为算法导论24.1的C++实现。#include using namespace std;#define N 5#define INFINITE 0x7fffffff#define WHITE 1#define GRAY 2#define BLACK 3//顶点结点结构 struct Vertex { Vertex * next;/*指向下一个顶点*/原创 2012-11-19 14:45:35 · 2625 阅读 · 0 评论 -
【算法导论】线性时间选择---从数组中选择第i小的数
问题:从数组中选择第i小的数,并且要求问题的时间复杂度为O(n)。代码用到了随机化的快速排序中的分组方法。其基本原理为:用快速排序的分组方法,随机的选择一个数组元素,使其大于左边的元素,小于右边的元素。然后,看这个元素的下表与要求元素中第i小的值是否相等,如果小于i则表示要查找的元素在当前分组元素的右边,如果大于i表示在左边。这样递归进行,可以达到很高的运行效率。c++实现的代码如下:原创 2012-10-12 20:07:28 · 5327 阅读 · 0 评论 -
【面试题精选】4 优先级队列,堆积
优先级队列为,首部元素最大,总是删除当前最大元素。并在尾部插入元素。删除元素的时间复杂度为O(1),插入元素的时间复杂度为O(lgn),效率非常高。C++实现代码如下:#include using namespace std;const int MAX_SIZE = 1024;int Tail = 0;int PriorStack[MAX_SIZE]={0};bool原创 2012-10-07 18:24:37 · 1664 阅读 · 1 评论 -
【面试题精选】3 数字操作-翻转及求和
在这里介绍两个操作数字的小程序,程序不难,但是需要一定的技巧:代码如下:#include using namespace std;int digitSum(int digit);int digitReverse(int num);int main(int argc,char * argv[]){ return 0;}/*返回正整数中的各位数字之和,比如49205返回20*/原创 2012-10-04 20:08:53 · 1302 阅读 · 0 评论 -
八数码问题--A算法实现---C#实现---VS2008可以执行
<br />问题描述:<br /><br /> 有一个3×3的棋盘,其中有0~8九个数字,0表示空格,其他的数字可以和0交换位置。求由初始状态到达目标状态步数最少的解。<br /> 解决八数码问题的常用方法为图搜索法,可用广度优先、深度优先和A*算法实现,其中A*算法又因估价函数的不同而有着不同的搜索时间。<br /> 用A算法可以得到较好的搜索策略,普通的宽度优先搜索在这个例子中生成了27个状态,有效地搜索状态仅为5个。用A算法,加入了估价函数,中间的生成状态仅为5个,原创 2010-12-15 11:25:00 · 2152 阅读 · 2 评论 -
非递归形式的N皇后问题---用C#实现,VS2008可以执行
补充一下,解决8皇后需要不到一秒时间,16皇后需要大约4分钟。32皇后我测试了8天,这8天基本上没用电脑,回朔搜索到了200多亿次,后来没有耐心等下去了,结束了程序,没有搜索到结果。原创 2010-11-23 20:57:00 · 1534 阅读 · 0 评论 -
【算法导论】装备线调度问题
本程序为算法导论中动态规划章节(15.1)的装配线调度问题的C++实现代码,具体问题就不详细说明了,代码如下:#include#includeconst int max_len = 6;int a[max_len][2] = {{7,8},{9,5},{3,6},{4,4},{8,5},{4,7}};/*装配站a,i,j上的耗费时间*/int t[max_len-1][2] = {{原创 2012-05-30 15:15:56 · 1294 阅读 · 0 评论 -
【算法导论】同时找出最大值和最小值
在一个有n个元素的集合中,需要多少次比较才能确定其最小、最大元素呢?如果一个一个的比较,那么需要n-1次比较,是不是有更好的方法呢?如果,在比较中,记录遇到的最大值和最小值。将输入的元素两两比较,然后与当前的最大值、最小值进行比较。这样每2个元素需要3次比较,而不是原来的4次。实现代码如下:void MiniNum(){ const int size = 100000; int原创 2012-07-04 16:22:23 · 6403 阅读 · 0 评论 -
【算法导论】c++实现的随机化的快速排序
随机化的快速排序:#include #include #include void swap(int * a,int * b);int partition(int * array_list,int left,int right);void Print();int random_partition(int * array_list,int left,int right);void原创 2012-07-04 17:21:03 · 1776 阅读 · 0 评论 -
【算法导论】c++实现计数排序
计数排序的基本思想为:对每一个输入的元素x,确定出小于x的元素的个数。有了这一信息,那么就可以把x直接放到相应的位置上。特点:1 需要临时的存储空间,如果排序数据范围特别大时,空间开销很大。2 适合于排序0 - 100以内的数据。3 排序的时间复杂度为O(n)。#include #include const int size = 100;int * array_list原创 2012-07-06 15:23:29 · 4055 阅读 · 0 评论 -
【算法导论】c++实现堆排序
堆排序的过程就不说明了,代码如下:void Build_Max_Heap(int array_list[] ,const int array_size,const int index);bool HeapSort(int array_list[],const int array_size);int main(){ const int size = 10; int array_li原创 2012-06-27 17:42:07 · 2028 阅读 · 1 评论 -
【算法导论】用C++实现快速排序
本算法为【算法导论】7.1的C++实现,代码如下:#includevoid swap(int * a,int * b);int partition(int * array_list,int left,int right);void quick_sort(int * array_list,int left,int right);void Print();const int size原创 2012-06-29 16:14:57 · 1759 阅读 · 1 评论 -
【面试题精选】2-求二元树的路径和
题目来源:微软面试100题:在二元树中找出和为某一值的所有路径题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如输入整数22 和如下二元树10/ \5 12/ \4 7则打印出两条路径:10, 12 和10, 5, 7。#include using nam原创 2012-09-27 20:59:54 · 1022 阅读 · 0 评论
分享