谈谈对系统学习计算机算法重要性的感想

在解决一道利用二分算法就很简单,不知道二分算法就无从下手的问题过程中,可以深刻体会到算法的重要性。

题目

现在,让我们放空自己,来看一道题目:

给一棵二叉树,找出从根节点出发到叶节点的路径中,和最大的一条。返回该和。
如下,返回4
       1
      /      2   3

题目中的例子过于简单,举个复杂些的例子:

             1
            /            6   7
          / \ /          3 12 1  2

解题思路

如果高中的你,并不知道“分治算法”,你该怎么解这个题目?只能说很难。

常规思路是每往下一层,就判断哪个分支更大(1->7分支),但这只是贪图眼前,无法保证当前选择的分支的子树也是值更大(1->7的分支均小于1->6的分支)。这如何是好,只能计算所有分支和,最后进行比较,这显然不行。

但如果你知道分治算法(前提),并且看到本题也想到了分治算法(根本),那问题就很简单(细枝末节)。

根据分治算法思想,将问题先“分”后“治”。

分:将树分成左右子树(二叉树是纯天然的分治结构),分别计算左子树和右子树的最大路径和。

治:比较左子树和右子树的和的大小,取大值再加上自己的值。

整个过程递归一下,代码就出来了:

    //C++
    int maxPathSum(TreeNode *root) {
        if(root == NULL)
            return 0;

        int left = maxPathSum(root->left);
        int right = maxPathSum(root->right);

        return max(left, right) + root->val;

    }

本题对于熟悉分治算法的人来说是入门题目,可是不了解分治算法的话,却很难快速解决。

个人笔记

本来写到上面就算结束了,但还是想记下自己的更多想法,外人当个人牢骚看看即可。

1. 分治算法在“分”的过程中并没有做实际的工作,也没有给出任何有用的解。完全是利用递归在到达最底层时才给出解,然后依靠递归的回归步骤慢慢给出解。(含有一定的抽象意味)

2. 在“治”的过程中也是“有着对第一步·分·的绝对信任”,直接对待求的解进行计算。

3. 整个步骤和“求阶乘”的递归基本是一样的,只是多了“分”的过程。

4. 如果不是二叉树结构的题目,用分治可能就没有这么直观,直接用root->leftroot -> right 就能表示左右分支。不过在数组里应该可以用> index< index来表示。

题外话

链接一个今天看到的有趣微博

《Coders at Work》里面,主持人问Douglas,你怎么定位自己,科学家还是工程师,或者艺术家?Douglas说,我其实是作家,有时用英语写作,有时用JavaScript写作。我做的就是结构化表达自己的想法。

时间: 2024-11-04 19:55:20

谈谈对系统学习计算机算法重要性的感想的相关文章

系统学习数据结构算法

决定在  上开始补习基础, 先加入: https://www.coursera.org/learn/algorithms-part1 其中 Welcome 给出了 BooKSite Ourbooksite, which is open to everyone and contains a wealth of supplementary information, including synopses of the textbook and Java code that you will be us

计算机算法学习(1) - 不相交集合数据结构

不相交集合 故名思意就是一种含有多个不相交集合的数据结构.典型的应用是确定无向图中连通子图的个数.其基本操作包括: Make-Set(x):建立一个新的集合,集合的成员是x: Union(x,y): 将包含x和y的集合合并为一个集合: Find-Set(x): 返回指向包含x的集合的指针: 下面是一个例子,(a)是一个无向图,(b)是使用不相交集合来找连通子图的个数.做法是初始为各个顶点为一个集合,然后遍历各个边,把边的端点的集合进行合并,当处理完所有的边,能连通的顶点就在一个集合里了,这样就生

(转)深度学习前沿算法思想

深度学习前沿算法思想 本文转自: https://mp.weixin.qq.com/s?__biz=MzA5NDExMTAzNA==&mid=2649981646&idx=2&sn=8fe05eac5a5068efb65ca1602e5fd3a0&chksm=8854b69bbf233f8db5dbaa1ea8396d181c9a35e760ab3c1c4934b504f69fe92683972d78d327&mpshare=1&scene=2&sr

Linux系统理解以及Linux系统学习心得

原创作品转载请注明出处  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 作者:严哲璟 说一下我对Linux系统的理解 1.加载Linux内核准备:在加载基本输入输出模块(BIOS)之后,从磁盘的引导扇区读入操作系统的代码文件块到内存中,之后开始整个系统的初始化. 2.main.c的start_kernel函数是整个操作系统的入口,这也与Linux是基于C语言的特性相符,start_kernel具体做的动作很多

2019年,该怎样去系统学习大数据,知识+内容+教程

大数据作为2019年比较热门的技术,受到越来越多的关注,那么对于一个想进入大数据的朋友来说,最想知道的是:大数据学什么?今天科多大数据就和你们一起来分享一篇关于大数据学习内容体系介绍的文章. 大数据技术体系太庞杂了,基础技术覆盖数据采集.数据预处理.分布式存储.NOSQL数据库.多模式计算(批处理.在线处理.实时流处理.内存处理).多模态计算(图像.文本.视频.音频).数据仓库.数据挖掘.机器学习.人工智能.深度学习.并行计算.可视化等各种技术范畴和不同的层面.另外大数据应用领域广泛,各领域采用

大数据分析与机器学习系统学习路线指导(1)

3.开始专业课程的学习,请根据自己的学习能力和基础,逐渐选择学习课程,一年完成学习即可!三个专业方向课程详解如下: 数据分析师专业方向 学习路线建议 课程名称 难易程度 基础课 大数据的统计学基础 ★ 基础课 大数据的矩阵计算基础 ★ 工具课 深度玩转Excel ★ 工具课 R语言数据分析.展现与实例 ★ 工具课 SPSS数据分析入门与提高 ★★ 工具课 数据分析与SAS ★★ 应用课 基于软件学习数据挖掘算法与案例 ★ 应用课 BI实战之cognos 篇 ★★ 应用课 量化投资 ★★ 应用课

非计算机专业学习计算机

一个同学的问题:李老师好,我是一名文科类专业学生,但本身对计算机信息专业方面很感兴趣,并希望在此方面有所发展,但对该学科总体架构方面诸多迷惑,不知您能否为我提出些许建议? 我想了一下计算机专业的课程设置给了如下建议: 1.找计算机系统结构.组成原理.操作系统.计算机网络.数据库原理.信息管理系统这些书看看,能理解多少理解多少.这个可以和下面的过程同步进行,并且重复多遍.2.找本C语言的书或者Java语言的书,书一定要偏操作的,最好你能跟着书做.把书后的习题上机调试了.3.找本数据结构的书,尽量去

算法学习——分治算法

这是从网上查到的概念资料,先收来~ 一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的问题所需的计算时间都与其规模有关.问题的规模越小,越容易直接求解,解题所需的计算时间也越少.例如,对于n个

学习计算机组成原理~~指令系统与性能

本人之前没有系统学习过,计算机组成原理,现在只能自己学习~~ 首先是概念: 指令---计算机去执行某种操作的命令.---Instruction 指令系统----机器指令的集合,也称指令集. Instruction Set . CIS(复杂指令系统,Complex  Instruction Set ),具有复杂指令系统的计算机称为复杂指令系统计算机(CISC). CISC中只有20%常用,产生了精简指令系统(RIS--Reduced  Instruction Set),具有RIS的计算机称为精简指