算法录 之 基础算法

  这一篇文章主要说说一些基础算法,这些算是很多其他算法的基石。

  主要包括  模拟,暴力,枚举,递归,贪心,分治

  1,模拟:

    顾名思义,模拟就是。。。饿,模拟,有一些题目就是给你一些步骤,然后你写代码一步步去模拟那些步骤就行。这类题目主要属于基础题,但是当然如果需要模拟的步骤足够恶心的话,还是比较麻烦的。。。

    具体模拟的例子在之后的练习中会遇到的,按照题目要求一步步做就行,一般算法难度比较小。

  2,暴力:

    顾名思义,暴力就是。。。饿,暴力。比如说题目让从平面上的10个点中取三个点,让他们形成的三角形面积最大。那么暴力的方法就是直接列举所有可能的组合情况,然后一个个的算,找到里面的最大值。。。就是这么暴力。

    当然暴力不一定只是无脑的蛮力,有时可能需要根据题目去排除一些不可能的情况,让暴力更快。

    当然采取暴力的话要看题目的数据范围,当然还要有胆子,一句话就是 人有多大胆,地有多大产。。。

  3,枚举:

    顾名思义,枚举就是。。。饿,枚举。就是一个个列举所有的数,然后一个个算就好了。和暴力感觉其实差不多。

    比如说第二场那个H题,就需要一个比较聪明的枚举。枚举每一个起点显然会超时,所以需要各种转换,变成枚举长度,然后就可以证明只需要枚举 根号n 次就行。

    所以说很多题目需要一些聪明的转化,然后再枚举。。。

  4,递归:

    顾名思义,递归就是。。。饿,递归。C++的书上面应该有说个函数的递归,没看到的先回去看看。

    然后就是关于递归的经典的汉诺塔问题。

    具体汉诺塔是什么请百度或者谷歌。

    然后现在解决这个问题:一个 N 层的汉诺塔,输出他的移动步骤,从A杆到C杆。

    解决的话就是我们先把一个 N-1 的汉诺塔从A移动到B,然后把最后一个从A移动到C,然后再把 N-1 的汉诺塔从B移动到C就行了。。。

    N-1层的汉诺塔递归解决就行了。。。

    具体代码如下:

void Hanoi(int N,char A,char B,char C)
{
    if(N==1)
    {
        cout<<A<<" -> "<<C<<endl;
        return;
    }

    Hanoi(N-1,A,C,B);    // N-1的,从A到B。
    cout<<A<<" -> "<<C<<endl;
    Hanoi(N-1,B,A,C);    // N-1的,从B到C。
}

    建议好好看看最好理解这段代码。。。

    递归差不多就是这样,借助函数的递归,把大的问题化成小的问题去解决,然后合并小的问题。。。

  5,贪心:

    顾名思义,贪心就是。。。饿,贪心。有一些问题让最后的结果最优,然后我们可以直接遍历,每次对于当前情况取最优的,无视会不会影响其他情况,然后只要能证明每次取当前最好的,总的结果是最好的,那么这样的贪心就是正确的。。。

    比如说以下问题:

  你带着一个容量为V的背包去市场,市场上面有N种节操在卖,其中第 i 种节操的单位体积的价格是 Pi,然后最多 Ci 体积的节操卖。

  然后问最少花多少钱能把背包装满节操?

    典型的贪心的题目,显然买最便宜的最好,所以每次找 Pi 最小的那个去买,如果全部买来还装不满背包,就买 Pi 第二小的。。。然后一直这样,一直到装满背包。。。

    这样每次取最便宜的买,那么最后花的钱最少,这样正确性不用多说吧。。。

    贪心差不多就是这样,但是注意有些问题可能看起来很对,但是可能偏偏贪心有漏洞,也有可能看起来就是不太对,但是其实可以证明某种贪心是对的。。。

  6,分治:

    顾名思义,分治就是。。。饿,分治。分而治之,这和递归差不多,其实分治一般就是通过递归来实现的。。。

    把大的问题分成小的问题去解决,然后把这些小问题合并得到大的问题的解。具体的例子的话之后会说,都是很经典的算法。。。

  具体的基础算法其实就这几个,他们都是很基本的东西,建议可以初步掌握先。然后很多很多的算法都是通过这些算法去搭建的。。。

时间: 2024-10-19 06:10:19

算法录 之 基础算法的相关文章

【算法】内功基础算法索引

字符串:https://www.cnblogs.com/zhangwanying/p/6472455.html 图论: 动态规划: 原文地址:https://www.cnblogs.com/zhangwanying/p/9898999.html

算法录 目录索引。

(注:本文持续更新中.) 忙完了九月的一系列比赛之后,十月初收拾了一下也该准备写点入门的东西了,顺便给许久不更新(太懒了)的博客拉拉访问量.不过限于个人水平的原因写的不好请别打我... 至于算法是啥这些思想性的东西就不多说了,几乎每本入门书都会提及到.而且这类哲学问题还是要大家自己去想去理解... 这一篇文章主要是目录索引,接下来的话算法录这个分类里面应该会慢慢更新三种类型的文章,分别是 算法录,数据结构录,ACM录,这三种也算是相互联系的... 算法录: 内容:主要说的是对一些算法的学习和讲解

九章算法 基础算法 强化算法 系统设计 大数据 安卓 leetcode 高清视频

leetcode 直播视频讲座录像 九章算法视频录像,PPT 算法班,算法强化班,Java入门与基础算法班,big data项目实战班,Andriod项目实战班 九章算法下载 九章算法面试 九章算法leetcode 九章算法答案 九章算法mitbbs 九章算法班 九章算法ppt 九章算法录像 九章算法培训 九章算法微博 leetcode 视频 九章算法偷录 算法培训 算法班课程大纲: 1 从strStr谈面试技巧与Coding Style(免费试听) 2 二分搜索与旋转排序数组 Binary S

基础算法之排序--快速排序

1 /************************************************************************************** 2 * Function : 快速排序 3 * Create Date : 2014/04/21 4 * Author : NTSK13 5 * Email : [email protected] 6 * Copyright : 欢迎大家和我一起交流学习,转载请保持源文件的完整性. 7 * 任何单位和个人不经本人允许不

最最最最最最最最基础的C---C简介和基础算法

C简介 C是一门程序设计语言,面向过程的语言.于1972至1973年设计出来的语言. C具有32个关键字,9种控制语句,34种运算符. 函数是C的基本单位:一个C程序的执行总是从main函数开始的. C程序运行步骤:源程序--编译-->目标文件--执行-->可执行目标程序. 基础算法 完整的程序设计=数据结构+算法+程序设计方法+语言工具 算法特效: 1.有穷性:一个算法包含有限的操作步骤 2.确定性:确定算法的每一个步骤都是确定的 3.有零个或多个输入 4.有一个或多个输出 5.有效性:算法

基础算法

c语言基础算法大全 冒泡排序 选着排序 插入排序 快速排序 shell排序. 合并排序. 下面是各个排序算法的实现: 冒泡排序 void bobuleSort(int a[], int len) { int i,j,flag =1; for(i = 0; i<len; i++) { for(int j =len-1; j>i; j--) { if(a[j] <= a[i]) { int tmp = a[j]; a[j] = a[i]; a[i] = tmp; flag = 0; } }

算法与数据结构基础10:C++实现——拓扑排序

一 定义 拓扑排序是对有向无环图(Directed Acyclic Graph简称DAG)顶点的一种排序, 它使得如果存在一条从顶点A到顶点B的路径,那么在排序中B出现在A的后面. 二 先决条件 能够进行拓扑排序图有两个先决条件:有向.无环,即有向无环图. 三 偏序全序 连通图:任意两点之间都存在至少一条边 偏序:非连通图(有向无环图满足偏序关系) 全序:单连通图 四 结果唯一性 对于仅满足偏序关系的有向无环图中,因为有两个点之间的关系是不确定的,所以导致排序的结果是不唯一的. 满足全序关系的有

复习基础算法的感想

晚上做杭电OJ,第二题是一个比较直观的题,我也是太直观了.贴出代码,供自己反省,从7点15分一直做到结束,wa9次....orz....看来自己的算法功底还差的很远很远. 接下的几天,学习大白上的基础 算法部分. #include<iostream> #include<stdio.h> #include<cstring> using namespace std; char a[20],b[20]; char c[20]; void shuchu(int num) { i

二叉树基础算法总结

记录一些二叉树的基础算法 二叉树节点结构: typedef struct TreeNode{ int val; struct TreeNode *left; struct TreeNode *right; }TreeNode,*Node; 1.遍历 前.中.后序递归遍历: void pre_order_traversal(TreeNode *root){ if(root! = NULL){ visit(root); pre_order_traversal(root->left); pre_ord