c++算法 订阅
《国外经典教材·C++算法:图算法》是由清华大学出版社出版编著的实体书。《国外经典教材?C++算法:图算法(第3版)》所关注的是图算法领域。从实用的视角,以独特的结构将有关内容组织在一起,从而使读者不仅可以对这一领域有系统性的认识,而且还可在实践中灵活使用所提供的算法工具。 展开全文
《国外经典教材·C++算法:图算法》是由清华大学出版社出版编著的实体书。《国外经典教材?C++算法:图算法(第3版)》所关注的是图算法领域。从实用的视角,以独特的结构将有关内容组织在一起,从而使读者不仅可以对这一领域有系统性的认识,而且还可在实践中灵活使用所提供的算法工具。
信息
ISBN
9787302072515
装    帧
平装
书    名
国外经典教材·C++算法:图算法
开    本
16
出版社
清华大学出版社
国外经典教材·C++算法:图算法作者简介
塞吉维克,普林斯顿大学计算机科学系教授,在Adobe系统公司担任总监,并担任过Xefox PARC、IDA和INRIA等项目的研究人员。他从斯坦福大学获得了博士学位,是算法宗师Donatd E.Knuth的门下高徒。曾与Philippe Flajolet合著了《算法分析基础》一书。
收起全文
精华内容
下载资源
问答
  • C/C++算法竞赛代码框架

    千次阅读 多人点赞 2021-02-15 23:44:29
    C/C++算法竞赛代码框架 包含基本代码框架和本地测试代码框架,本地测试代码支持重定向输入输出和输出程序运行时间

    C/C++算法竞赛代码框架

    一、基本代码框架

    1.最简框架

    最初接触C/C++时,没有学习文件、函数等知识,仅知道在这个框架下写出语句就可以在终端进行基本输入输出。

    • (1)C语言

      #include <stdio.h>
      int main()
      {
          /*code*/
          return 0;
      }
      
    • (2)C++

      #include <iostream>
      using namespace std;
      int main()
      {
          /*code*/
          return 0;
      }
      

    2.万能框架

    随着学习的深入,基本的输入输出已经无法满足做题的需要,可以为了方便程序编写,事先将常用头文件包含进来。

    • C语言(包含常用头文件)

      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      #include <math.h>
      int main()
      {
          /*code*/
          return 0;
      }
      
    • C++(包含万能头文件)

      #include <bits/stdc++.h>
      using namespace std;
      int main()
      {
          /*code*/
          return 0;
      }
      

    二、测试代码框架

    1.时间测试框架

    在面临较大规模的数据输入时,需要大致判断程序运行时间和算法效率的对比时,可以使用<time.h>头文件,并在输出的最后一行打印出程序的时间。clock()函数获得程序运行的时间,CLOCKS_PER_SEC和系统相关,两者相除便是程序运行秒数。由于输入数据会占用程序运行时间,可以使用文件重定向方法(见下文)和“管道”小技巧:

    管道小技巧:
    使用命令行运行程序echo 数据 | 程序名

    • C语言

      #include <stdio.h>
      #include <time.h>
      int main()
      {
      
          /*code*/
          
          printf("\nTime used = %f", (double)clock() / CLOCKS_PER_SEC);
          return 0;
      }
      
    • C++

      #include <bits/stdc++.h>
      using namespace std;
      int main()
      {
      
          /*code*/
          
          printf("\nTime used = %f", (double)clock() / CLOCKS_PER_SEC);
          return 0;
      }
      

    2.文件重定向框架

    对于大规模数据的输入和输出,可以将标准输入输出重定向到程序同一目录下的输入data.in输出data.out文件中。使用重定向语句:freopen( "data.in", "r", stdin);freopen( "data.out", "r", stdout);。在提交代码时一定记得将这两行语句注释掉!!!

    • C语言

      #include <stdio.h>
      int main()
      {
          freopen("data.in", "r", stdin);		//提交代码时记得注释掉或删除
          freopen("data.out", "r", stdout);	//提交代码时记得注释掉或删除
          
          /*code*/
          
          return 0;
      }
      
    • C++

      #include <bits/stdc++.h>
      using namespace std;
      int main()
      {
          freopen("data.in", "r", stdin);   //提交代码时记得注释掉或删除
          freopen("data.out", "r", stdout); //提交代码时记得注释掉或删除
      
          /*code*/
          
          return 0;
      }
      

    三、终极框架

    1.终极框架代码:

    C++可以兼容C语言程序,且拥有更多函数模板、类模板和算法,因此终极框架采取C++语言。

    #define LOCAL            //本地调试宏定义
    #include <bits/stdc++.h> //万能头文件
    /*宏定义及常量定义部分*/
    #define INF 10000
    const int MAX = 1000000000;
    /*大规模数组的定义*/
    int Array[INF];
    
    using namespace std;
    int main()
    {
    #ifdef LOCAL
        freopen("data.in", "r", stdin);   //提交代码时记得注释掉或删除
        freopen("data.out", "r", stdout); //提交代码时记得注释掉或删除
    #endif
    
        /*code*/
    
    #ifdef LOCAL
        printf("\nTime used = %f", (double)clock() / CLOCKS_PER_SEC);
    #endif
        return 0;
    }
    

    2.终极框架说明:

    • 1.测试本地条件编译宏定义

      #define LOCAL 
      

      定义宏用于本地测试时的条件编译,提交代码时仅需将此行注释掉

    • 2.万能头文件

      #include <bits/stdc++.h> //万能头文件
      

      C++的万能头文件,此头文件包含了几乎所有的头文件,具体头文件内容定义见本文末附录部分。大部分竞赛和oj平台支持万能头文件,但不推荐在工程上使用。

    • 3.常量及宏定义

      /*宏定义及常量定义部分*/
      #define INF 10000
      const int MAX = 1000000000;
      

      宏定义和const常量定义均可以用来定义常量,方便更改常量的值,且提高代码可读性,在存储空间充足的条件下,推荐const常量定义,可以进行类型检查。

    • 4.大规模数组定义

      int Array[INF];
      

      将大规模数组定义在main函数外,定义成全局变量,一是可以无需手动初始化,全局变量数组定义后自动初始化;二是全局变量存储在数据区,减小栈区的开销。

    • 5.条件编译文件重定向语句及运行时间测试语句

      #ifdef LOCAL
          freopen("data.in", "r", stdin);   //提交代码时记得注释掉或删除
          freopen("data.out", "r", stdout); //提交代码时记得注释掉或删除
      #endif
      
      #ifdef LOCAL
          printf("\nTime used = %f", (double)clock() / CLOCKS_PER_SEC);
      #endif
      

      将重定向语句及运行时间测试语句均设置为条件编译,在本地编译运行时可以重定向输入输出并查看运行时间,提交代码时,只需要将第一行的LOCAL宏定义注释掉即可。

    附录

    • 万能头文件的定义
      #ifndef _GLIBCXX_NO_ASSERT
      #include <cassert>
      #endif
      #include <cctype>
      #include <cerrno>
      #include <cfloat>
      #include <ciso646>
      #include <climits>
      #include <clocale>
      #include <cmath>
      #include <csetjmp>
      #include <csignal>
      #include <cstdarg>
      #include <cstddef>
      #include <cstdio>
      #include <cstdlib>
      #include <cstring>
      #include <ctime>
      
      #if __cplusplus >= 201103L
      #include <ccomplex>
      #include <cfenv>
      #include <cinttypes>
      #include <cstdalign>
      #include <cstdbool>
      #include <cstdint>
      #include <ctgmath>
      #include <cwchar>
      #include <cwctype>
      #endif
      
      // C++
      #include <algorithm>
      #include <bitset>
      #include <complex>
      #include <deque>
      #include <exception>
      #include <fstream>
      #include <functional>
      #include <iomanip>
      #include <ios>
      #include <iosfwd>
      #include <iostream>
      #include <istream>
      #include <iterator>
      #include <limits>
      #include <list>
      #include <locale>
      #include <map>
      #include <memory>
      #include <new>
      #include <numeric>
      #include <ostream>
      #include <queue>
      #include <set>
      #include <sstream>
      #include <stack>
      #include <stdexcept>
      #include <streambuf>
      #include <string>
      #include <typeinfo>
      #include <utility>
      #include <valarray>
      #include <vector>
      
      #if __cplusplus >= 201103L
      #include <array>
      #include <atomic>
      #include <chrono>
      #include <condition_variable>
      #include <forward_list>
      #include <future>
      #include <initializer_list>
      #include <mutex>
      #include <random>
      #include <ratio>
      #include <regex>
      #include <scoped_allocator>
      #include <system_error>
      #include <thread>
      #include <tuple>
      #include <typeindex>
      #include <type_traits>
      #include <unordered_map>
      #include <unordered_set>
      #endif
      
    展开全文
  • C++算法 | 比较大小

    千次阅读 2020-11-26 16:36:15
    C++算法 学过C语言的对这句话应该不陌生:程序=算法+数据结构,C++作为一门既可以面向过程也可以面向对象的语言,这样理解也是没有问题的。 C++当作为面向过程时,应该包括两部分:一是对数据的描述,即在程序中指定...

    C++算法

    学过C语言的对这句话应该不陌生:程序=算法+数据结构,C++作为一门既可以面向过程也可以面向对象的语言,这样理解也是没有问题的。

    C++当作为面向过程时,应该包括两部分:一是对数据的描述,即在程序中指定数据的类型和组织形式,也就是所谓的数据结构;二是对操作的描述,也就是算法。

    算法是处理问题的一系列步骤,比如你要实现某一功能,需要具体明确在执行时每一步应该怎么做,总之无论时面向过程还是面向对象,都离不开算法。

    算法的表示

    1、自然语言,中文或英文描述的算法。

    2、流程图,结构图流程图和传统的流程图。

    3、伪代码,学过数据结构的都知道,伪代码时用介于自然语言和计算机语言之间的文字和符合描述。

    4、用计算机语言表示算法。

    案例:比较两个数的大小,并输出较大的数。

    #include<iostream>
    using namespace std;
    int main()       //主函数
    {
      int num_1,num_2,max; //定义整型变量
      cin>>num_1>>num_2; //键盘输入两个数
      if(num_1>num_2) //比较大小
      {
        max=num_1; //把较大的值赋值给max
      }
      else
      {
        max=num_2;
      }
      cout<<max<<endl; //输出max
      return 0;
    }
    

    执行本程序之后,在键盘输入4 5,会输出5。

    这是一个简单的比较大小算法,将大值赋给max,输出max,读者应该很容易看懂,读者可以自己去尝试下比较三个数的大小。

    C++实现比较大小

    更多案例可以go公众号:C语言入门到精通

    展开全文
  • C++算法之——常用算法总结

    万次阅读 2015-06-23 19:35:08
    基本的C++算法分为三类:排序算法、树算法、图算法 算法思想有三种:递推、分治、动态规划 以及 贪心算法。 本文将简要介绍上面三类算法,介绍时穿插介绍算法思想。 一、排序算法 1、基本O(n^2)排序...

    基本的C++算法分为三类:排序算法、树算法、图算法

    算法思想有三种:递推、分治、动态规划 以及 贪心算法。
    本文将简要介绍上面三类算法,介绍时穿插介绍算法思想。

    一、排序算法

    1、基本O(n^2)排序算法: (对基本排序算法的时间复杂度分析主要考虑  比较次数、数据交换次数)
    冒泡排序:针对数组、本地排序、需要交换数据。O(1)额外空间
    选择排序:一般针对数组、本地排序、需要交换数据。O(1)的额外空间
    插入排序:可以是针对数组的本地排序,此时需要移动大片数据,但是比较次数是O(N*logN)。如果是针对链表,比较次数是O(N^2),但是不需要交换数据。

    注意:一般排序都是针对数组的本地排序,数组与链表相比,可以随机访问,空间使用效率更高(链表需要存放指针),而链表一般对于插入与删除操作有更好的性能。

    2. O(N*logN)算法
    快速排序:针对数组的本地排序,时间复杂度平均O(N*logN),最坏时O(N^2)。空间复杂度O(1)
    归并排序:可以针对数组,也可以针对链表。针对数组时时间复杂度为O(N*logN),空间复杂度为O(N)

    3. 堆排序
    1991年计算机先驱奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德(Robert W.Floyd)和威廉姆斯(J.Williams)在1964年共同发明了著名的堆排序算法( Heap Sort )
    堆是一种非常高效的数据结构,可以用数组来表示堆。

    堆排序是针对数组的本地排序,时间复杂度为O(N*logN),空间复杂度为O(1)

    对于降序排列时用最小堆,首先建立堆,然后将第一个元素(堆头)与组后一个元素交换。找到了排列的最后一个元素,然后再调整前N-1个元素为最小堆,依次类推,即完成排序。

    注意:堆得建立, 堆的建立的时间复杂度为O(N*logN),可以有多种方法建立堆

    4. 基数排序
    数据的取值范围不大,利用bitmap

    5. 外排序
    归并排序,多路归并排序(利用堆实现多路归并排序)
    使用堆进行多路排序时,堆中的每个元素同附加上一个域,存放该元素来自那一路

    堆一般还可以用于TopK算法,求TopK最大可以使用K个元素的最小堆维护K个最大元素,对原始数组扫描一遍即可。

    二、树的算法
    树一般用链表实现,通常用树数据结构实现数据的快速插入、删除、查找。

    1. 平衡二叉查找树
    RB-Tree、 AVL、 Treap、 伸展树(无需存放额外信息)

    2. B树
    用于建立文件系统或数据库的索引。B树的设计目标是减少IO访问次数。B树也是一棵平衡树

    3. 二项树、二项堆、费波那奇堆

    三、图的算法
    1. 图的表示
    有向图、无向图 的 邻接表表示、矩阵表示

    2. 广度优先搜索、深度优先搜索
    广度优先搜索(BFS):找到从单个源点到所有点得最短路径,适用于有向图、无向图。算法发杂度为O(V+E),注意算法对应图的边没有权重。算法使用队列实现广度优先。算法使用三个辅助变量、color、paraent、distance数组。搜索后的parent构成广度优先树

    深度优先搜索(DFS):可以随意从一个节点开始,遍历树的所有节点,使用于有向图、无向图。搜索构成森林。算法通过递归方式实现,依次递归完成后可能只搜索整个连通树的部分节点,因此需要从新任意选择一个节点从新开始DFS,整个搜索结果构成搜索森林。算法使用三个辅助变量:color,v,f。v表示搜索到该节点时间,f表示该节点的邻接节点都扫描完成的时间。

    注意DFS可以完成拓扑排序。利用f出现时间的降序就是拓扑序,可以在深度优先搜索的过程中得到该排序。
    DFS算法还可以用于发现强连通分支。

    3. 最小生成树

    针对无向连通图的,常见的算法有 Kruskal算法和Prim算法

    Kruskal算法
    将所有的边非降序排列,所有的顶点初始化为不相交集合,每次取一个边,如果该边属于不同的集合,则该边加入解集,同时更新不想交集合。注意:不想交集合实现有专门的数据结构。

    Prim算法
    该算法与Dijkstra算法类似,每次加入已覆盖集合A和未覆盖集合B之间最短的边。



    4. 最短路径

    有权值的最短路径问题。可以是有向图,可以是无向图。权值可以为负值。

    变种:点与点之间最短路径、固定终点最短路径、所有点之间最短路径、最长路径(将权值去负值利用bellman-ford算法即可)

    Bellman-Ford算法
    惊醒V-1遍松弛遍历,每次遍历,按照一定顺序,依次将所有的边松弛一遍。结束后,对所有的边进行一次check,如果有边不符合松弛条件,则返回false,表明图中存在负权值的环(该特性可以用于检测有向图中得环),算法复杂度O(VE)

    Dijkstra算法
    只能针对于正值的边。算法复杂度O(V^2)


    5. 求所有点之间的最短路径
    矩阵上得动态规划算法。
    Floyd-Warshall算法,d_ij(k) 表示从顶点i到顶点j,中间节点只包含{1、2、... k}的最短路径。d_ij(n)即为所求。
    Floyd-Warshall算法可以用于求任意两个顶点是否可达
    展开全文
  • c++算法之分解质因数

    万次阅读 多人点赞 2016-03-22 22:18:13
    C++算法分解质因数

    分解质因数

    这是自己发的第一篇文章,虽然自己注册有一段时间了,总说着要写一下笔记,但自己比较懒,或觉得麻烦,反正给自己找了各种理由,看见同学去参加比赛,自己有点不甘心,也想给自己一点成就感,也让自己及时总结知识积累经验。好了废话少说,进入今天的正题--分解质因数。
    怎样分解一个质因数这个我们在小学就学过了,这里就细讲了
    如:
    <pre class="cpp" name="code">#include<iostream>
    using namespace std;
    int main()
    {
    	cout << "请输入一个整数" << endl;
    	int num;
    	cin >> num;
    	int i;
    	for (i = 2;i <= num;i++)//核心代码
    	{
    		while (num != i)//先确定num不等于2
    			if (num%i == 0)//当num/i没有余数时,说明i是num的一个质数
    			{
    				cout << i << ",";//输出i
    				num = num / i;//取num/i整数部分
    			}
    			else break;//然后跳出,重新来,此时num变了,i也变成2了,因为重新开始
    	}
    	cout << num;
    	system("pause");
    	return 0;
    }
    

    
    
    展开全文
  • C++ 算法大全 PDF

    千次下载 热门讨论 2011-07-28 17:23:31
    C++ 经典算法大全。内容详细,算法经典。很值得一看。
  • c++算法设计:贪心算法

    千次阅读 2019-05-20 23:16:58
    贪心算法采用自顶向下的方法,如此问题中n个活动,我们首先安排第一个活动,并判断下一个活动哪一个的开始时间与第一个活动的结束时间匹配。所以贪心算法总是第一步就做出选择。 给个伪代码: template<class ...
  • C++算法之组合算法

    千次阅读 2018-06-23 22:36:41
    什么是组合? 在组合中取出元素的顺序则不在考虑之中。从个元素中取出个元素,这个元素可能出现的组合数的总数量为:以1234中选2个数为例:1,2、 1,3、 1,4、 2,3、 2,4、3,4#include "stdafx.h"...
  • 总体来说,没有做太多准备,这次面试也只是抱着能够收获一些当前市场对C++算法工程师有哪些能力要求的角度来面对的。所以前两个问题是完全懵逼的,简历挂在网上太久,自己都快忘记了里面写了些啥。 不过分析来看,...
  • 本人近期在开发连连看的游戏,运用了炫彩界面库,但是不知道如何与c++算法联系,也就是说如何在界面库编写游戏代码?这两者能结合吗?希望被告知,感激不尽!
  • C++算法之遗传算法及实现

    千次阅读 2018-07-08 22:53:55
    1、遗传算法基本思想核心是达尔文优胜劣汰适者生存的进化理论的思想。一个种群,通过长时间的繁衍,种群的基因会向着更适应环境的趋势进化,适应性强的个体基因被保留,后代越来越多,适应能力低个体的基因被淘汰,...
  • QT C++ 算法 广搜BFS 最下步数复原二阶魔方 本人不是计算机专业,学过半年数据算法,当时有个大作业求解二阶魔方,有一个例子就是通不过测试,心存遗憾,工作时摸鱼想到问题所在,利用休假时间写个博客分享一下,...
  • C++算法之深度优先搜索算法详解

    万次阅读 多人点赞 2018-09-28 20:23:41
    1.深度优先搜索算法  深度优先搜索是一种在开发爬虫早期使用较多的方法。它的目的是要达到被搜索结构的叶结点(即那些不包含任何超链的HTML文件) 。在一个HTML文件中,当一个超链被选择后,被链接的HTML文件将执行...
  • void knapssack(int *W, int *V, int N, int C) { int *f = new int[C+1]{ 0 }, i, j; stack<int> s; for (i = 0; i<N; i++) { for (j = 1; j<=C; j++) { if (j>=W[i]) ...}
  • c++算法之深搜 浅谈回溯与不回溯

    千次阅读 2017-07-10 17:05:59
    c++算法之深搜 浅谈回溯与不回溯 先说理论上的(个人意见):需要回溯的题大多都是迷宫这一类的,对这一步所做的操作不确定,可操作可不操作的(就像迷宫,这一步到底走不走并不确定),要将操作在递归之后回溯一步...
  • 本文原始地址:C / C++算法学习笔记(1)-快速排序算法   算法思想: 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。   关于分治法 基本思想是:将原问题分解为若干个规模更小但结构与...
  • 归并排序C++算法实现

    万次阅读 2019-03-31 15:41:17
    定义:归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子...
  • C++算法标准库常用算法

    千次阅读 2016-03-31 16:38:26
    1.算法 ①找到某个值,或者某个谓词判断 find find_if ②计数某个值,或者某个谓词判断 count count_if ③查找子序列 search ④查找最值 min_element 2.随机数 ①引擎 ②分布 例程 #include #...
  • C++算法基础之头文件

    千次阅读 2019-03-15 22:34:07
    C++中拥有在C语言里一样的语法,像输入输出。 #include<cstring> 包含很多字符串函数,如复制、比较是否相等、字符串连接。 #include<iostream> 输入输出流,包括输出格式的控制 #include<...
  • [C++算法]六种简单算法

    万次阅读 2016-10-26 23:07:01
    简单算法:冒泡、插入、选择、快速、归并
  • C++算法之递归算法--(5)

    千次阅读 2018-04-16 20:59:51
    递归算法C++中是一个比较经典的算法类型,其主要特征就是循环调用,直到达到结束条件为止才结束。 一般递归算法可以分为两部分: 1.递归部分:递归调用的程序主体; 2.递归出口:递归输出条件。 常用的解决...
  • C/C++ 算法 中缀转后缀表达式实现1

    万次阅读 2015-08-25 15:56:46
    C/C++ 算法 中缀表达式转换位后缀表达式实现1 中缀(infix)表达式:即人们常用的算数逻辑表达式,其特点是操作符位于操作数的中间,如表达式:a+b*c+(d*e+f)*g。虽然人的大脑很容易理解与分析中缀表达式,但对...
  • C++算法——BFS(图解)

    千次阅读 多人点赞 2019-09-02 16:45:46
    宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它...
  • C++算法和布尔类型

    千次阅读 2019-03-22 17:21:33
    算法的概念:程序员将完成某种功能的过程,分解成一组可被计算机执行的操作步骤,这组操作步骤就称为算法。 下面给一个简单的列题: 将华氏温度换算成摄氏温度 定义一个变量,申请保存摄氏温度和华氏温度数据所需...
  • C++算法实现Bellman-Ford算法

    千次阅读 2017-10-04 19:53:41
    Bellman-Ford算法的时间复杂度为O(VE); #include #include #include using std::cout; using std::endl; using std::vector; struct edge { int from; int to; double weight; }; struct graph { private: ...
  • GeekBand-极客班-C++算法原理与实践-董飞-课程笔记(一)算法入门和编程风格

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 92,266
精华内容 36,906
关键字:

c++算法

c++ 订阅