《算法导论》----------什么是算法?

何为算法?

算法,一个让我们听起来熟悉有陌生的词汇。很多刚毕业的大学生毕业的时候,在参加bat的面试,必不可少的两项,数据结构+算法。

那么什么是算法呢,今天就让我们跟着《算法导论》这本书,一起去翱翔算法的世界。

算法,顾名思义,就是计算的方法,这个计算是个很广义的词汇,可以指我们生活中买菜的计算,可以指我们程序中编程解法的计算,总之,算法是一个无所不在的东西。无论是我们的生活中还是工作中,都离不开算法。

生活中的算法:

相信大家小时候都做过这样的事情,就是妈妈给我们1块钱,这一块钱是我们一天的零花钱(可能大家都说一块钱能干个毛线,反正我小时候,1毛钱一个冰棍,1毛钱一袋透心凉饮料)。那么我这时候就要思考我这一块钱能干什么了,是买10个冰棍,还是买5个冰棍和5个透心凉。

此时,我的抉择就是一种算法的体现,就是在两种不同的方式下,达到一个身上钱全部花光的效果。

程序中的算法:

撸主最近在做安卓项目,下面就以我的安卓代码(其实也就是java的基础代码)作为示例,来让大家理解的算法。

第一种写法:

@Override
    public void onScrollChanged(BaseScrollView scrollView, int x, int y, int oldX, int oldY) {
        Log.e("滚动条状态",x+"  "+y+"  "+oldX+"  "+oldY);
<pre name="code" class="java">            int showOrHide = oldY > 0 ? View.VISIBLE:View.GONE;

if (scrollView == article_detail_scroll) { article_detail_btn_toTop.setVisibility(showOrHide); } }


第二种写法

@Override
    public void onScrollChanged(BaseScrollView scrollView, int x, int y, int oldX, int oldY) {
        Log.e("滚动条状态",x+"  "+y+"  "+oldX+"  "+oldY);
        int showOrHide = oldY > 50 ? View.VISIBLE:View.GONE;
        if (scrollView == article_detail_scroll && article_detail_btn_toTop.getVisibility()!= showOrHide) {
            article_detail_btn_toTop.setVisibility(showOrHide);
        }
    }

此时,观察我们的两段代码有什么不同,很直观的。

你可以发现第二段代码比第一段多了一个判断条件。

既article_detail_btn_toTop.getVisibility()!= showOrHide

那么这一句话是干嘛的呢,他是用来判断我们要设定的值是否和我们原来的值相等

如果相等的话,还设置一次干嘛呢。反倒是浪费了系统运行的性能

可能读到这里,有的朋友就会问了,你这两段代码和算法又有什么关系呢?

那么说明你到现在还没理解算法的含义,代码的忧略性性,也是体现程序设计的好坏(既:算法)的一种方式

什么?我说了这么多,你还不明白算法是什么。

那好吧,请不要放弃治疗,我会继续治疗你的病症的(开个玩笑别介意)

那给你讲个最简单的例子,我现在需要两个正整数,让两数相加等于3,既,满足:a+b=3

a和b的值可以是多少

方案一:a =1 b=2;

方案二:a =2 b=1;

这两种方案的不同,也是一种算法的体现,只不过是np不完全的算法解答(np以后会提到)

相信到这里,大家应该知道什么是算法了把。

            int showOrHide = oldY > 0 ? View.VISIBLE:View.GONE;
时间: 2024-10-05 20:48:00

《算法导论》----------什么是算法?的相关文章

算法导论之贪心算法

参考:http://www.cnblogs.com/Creator/archive/2011/06/07/2074227.html 贪心算法在几个基本算法里面算是相对简单的算法了,思路也是非常简单的,每一步总是做出在当前看来最好的选择.也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择.基本思路就是从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解.当达到某算法中的某一步不能再继续前进时,算法停止. 贪心算法存在的问题是: 1. 不能保证求得的最

算法导论——最短路径Dijkstra算法

package org.loda.graph; import org.loda.structure.IndexMinQ; import org.loda.structure.Stack; import org.loda.util.In; /** * * @ClassName: Dijkstra * @Description: Dijkstra最短路径算法--贪心算法 * @author minjun * @date 2015年5月27日 下午4:49:27 * */ public class D

【算法导论】贪心算法之活动选择问题

动态规划总是在追求全局最优的解,但是有时候,这样有点费时.贪心算法,在求解过程中,并不追求全局最优解,而是追求每一步的最优,所以贪心算法也不保证一定能够获得全局最优解,但是贪心算法在很多问题却额可以求得最优解. 一.问题概述 活动选择问题: 假定一个有n个活动(activity)的集合S={a1,a2,....,an},这些活动使用同一个资源(例如同一个阶梯教室),而这个资源在某个时刻只能供一个活动使用.每个活动ai都有一个开始时间si和一个结束时间fi,其中0<=si<fi<正无穷.如

算法导论学习-prim算法

一. 关于最小生成树 对于无向连通图G=(V,E),其中V表示图的顶点,E表示图的边,对于每条边都有一个权值,可以理解为边a->b的权值C为从a走到b要走的路程为C.现在我们希望找到一个无回路的子集T,且有T是E的子集,T连接了所有的顶点,且其权值和最小.那么这样一个子图G‘=(V,T)称之为图G的最小生成树. 二. 最小生成树的基本性质 最小生成树的边数|T|必然服从|T|=|V|-1. 最小生成树不可以有循环 最小生成树不必是唯一的. 三. Prim算法 对于最小生成树有两种算法:prim算

【算法导论】贪心算法之赫夫曼编码

概述 讨论赫夫曼编码问题,赫夫曼编码的思想就是变长编码.变长编码就是让字符表中出现概率高的字符的编码长度尽可能小,而出现概率高的字符的编码长度相对较长.然后还要遵循前缀码的要求,就是任意一个编码都不是其他编码的前缀码,这样方便解码. 思路及实现 对于下表中的字符和相应的出现概率,有对应图中的编码树: 可以比较容易的看出来,每个叶节点就代表一个字符,从根节点到叶节点走过的路径拼接起来,就代表这个字符的编码,比如f是1100,e是1101,而f和e是深度最深的节点也是概率最小的两个节点.这也就是我们

算法导论------------桶排序算法之研究

举个来说明桶排序的过程,假设现在有A={0.78,0.17,0.39,0.26,0.72,0.94,0.21,0.12,0.23,0.68},桶排序如下所示: 研究过计数排序我们知道了----计数排序是假设输入是由一个小范围内的整数构成,而桶排序则假设输入由一个随机过程产生的,该过程将元素均匀而独立地分布在区间[0,1)上.当桶排序的输入符合均匀分布时,即可以线性期望时间运行.桶排序的思想是:把区间[0,1)划分成n个相同大小的子区间,成为桶(bucket),然后将n个输入数分布到各个桶中去,对

算法导论-第一章-算法在计算中的作用(速记)

算法就是把输入转换成输出的计算步骤的一个序列. 问题实例由计算该问题解所必需的(满足问题陈述中强加的各种约束的)输入组成. 若对每个输入实例,算法都以正确的输出停机,则称该算法是正确的. 许多有趣的算法问题所共有的两个特征: 1.存在许多候选解,但绝大多数候选解都没有解决手头的问题.寻找一个真正的解或一个做好的解可能是一个很大的挑战. 2.存在实际应用. 数据结构是一种存储和组织数据的方式,旨在便于访问和修改. 原文地址:https://www.cnblogs.com/lixiaov/p/104

算法导论5.3-3

转自风清云淡的博客,他给出的解法非常的妙. 问题: 描述RANDOM(a,b)的过程的一种实现,它只调用RANDOM(0,1).作为a和b的函数,你的程序的期望运行时间是多少?注:RANDOM(0,1)以等概率输出0或者1,      要求RANDOM(a,b)以等概率输出[a,b]之间的数(整数) 解决方案: 1,取 n=b-a+1,取最小的正整数m,使得 2^m >= n         2,调用RANDOM(0,1),输出m-bit位整数N   (  N >= 0 and N <=

【算法导论】用动态规划解活动选择问题

上一篇讲了贪心算法来解活动选择问题([算法导论]贪心算法之活动选择问题),发现后面有一道练习16.1-1是要用动态规划来解活动选择问题.其实跟之前的矩阵链乘法有些相似,也是考虑分割的活动是哪一个,并用二维数据来记录Sij---最大兼容集合个数,和用另一个二维数据来记录Sij取得最大时的活动分割点k.然后就是考虑边界问题,和使用递归来求动态规划的最优解. 代码注解比较详尽: #include <iostream> #include <algorithm> using namespac

《算法导论》读书笔记之排序算法—Merge Sort 归并排序算法

自从打ACM以来也算是用归并排序了好久,现在就写一篇博客来介绍一下这个算法吧 :) 图片来自维基百科,显示了完整的归并排序过程.例如数组{38, 27, 43, 3, 9, 82, 10}. 在算法导论讲分治算法一章的时候提到了归并排序.首先,归并排序是一个分治算法. 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表, 即把待排序序列分为若干个有序的子序列,再把有序的子序列合并为整体有序序列. merg() 函数是用来合并两个已有序的数组.  是整个算法的关键. 那么归并