首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >小白的算法课-方法论

小白的算法课-方法论

作者头像
房上的猫
发布2021-04-28 11:19:42
2730
发布2021-04-28 11:19:42
举报
文章被收录于专栏:个人随笔个人随笔

为什么要重视算法

  • 面试毕竟历程
    • 其实这是个伪命题,如果为了面试,大家去背一下特定的几个算法答案就好了
  • 提高逻辑思维,理解能力
  • 提高代码质量

为什么说算法是程序员最应该学习的技能,没有之一

为什么这么说呢?可以思考一下

学框架其实就是学怎么更好的用人家封装好的api

看源码,就是看人家怎么实现的这个组件,学习人家的设计思维。

但真的是这样吗?但其实大多数情况都是为了应付面试,然后实际学习场景大家都是看看别人的博客,看看讲解视频,然后随便扒扒源码

综上所述其实,无论学习新框架还是看源码,更多的考验的是记忆力,与略微的理解能力

思考一下,为什么面试都要考算法?

其实我们都在逃避,相比于算法,其他的能力确实相对于来说比较容易掌握

  • 程序员更重要的就是逻辑能力,服务端更甚
  • 优秀的软件工程师必须具备过硬的代码开发能力,而这就体现在你对数据结构、算法思维、代码效率优化等知识的储备上,并直接反应在你工作中解决实际问题的好坏上。

能力分布表

逻辑能力

理解能力

记忆力

算法

60%

30%

10%

新框架,新知识

10%

20%

70%

源码探索

20%

30%

50%

为什么说算法会提高代码质量

举个简单的例子

在海量数据中查询指定数据,粗笨的方法就是循环便利一边找到对应的就好了,

如何用算法来解决?

  1. 有序存储
  2. 二分查找

收益:数据量小的时候可能没什么明显收益,但假如我们数据量达到了1000w,两种查找方法的效率可能就是1000万次和24次的区别了(log2 10000000 = 23.25)

代码质量如何一步步提高

  1. 暴力解法
    1. 在没有任何时间、空间约束下,完成代码任务的开发。
  2. 剔除无效操作处理
    1. 将代码中的无效计算、无效存储剔除,降低时间或空间复杂度。
  3. 时空转换
    1. 设计合理数据结构,完成时间复杂度向空间复杂度的转移。
  4. 逻辑归纳
    1. 利用逻辑关系,完成时间复杂度和空间复杂度的降低

eg1:

假设有任意多张面额为 2 元、3 元、7 元的货币,现要用它们凑出 100 元,求总共有多少种可能性

暴力解法

public void s1_1() {
    int count = 0;
    for (int i = 0; i <= (100 / 7); i++) {
        for (int j = 0; j <= (100 / 3); j++) {
            for (int k = 0; k <= (100 / 2); k++) {
                if (i * 7 + j * 3 + k * 2 == 100) {
                    count += 1;
                }
            }
        }
    }
    System.out.println(count);
}

3 层的 for 循环。从结构上来看,显然的 O( n³ ) 的时间复杂度。思考一下会发现,最内层的 for 是多余的剔除无效操作处理

public void s1_2() {
    int count = 0;
    for (int i = 0; i <= (100 / 7); i++) {
        for (int j = 0; j <= (100 / 3); j++) {
            if ((100-i*7-j*3 >= 0)&&((100-i*7-j*3) % 2 == 0)) {
                count += 1;
            }
        }
    }
    System.out.println(count);
}

eg2:

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。

暴力解法

public int[] s2_1(int[] nums, int target) {
        int n = nums.length;
        for (int i = 0; i < n; ++i) {
            for (int j = i + 1; j < n; ++j) {
                if (nums[i] + nums[j] == target) {
                    return new int[]{i, j};
                }
            }
        }
        return new int[0];
    }

时空转换

public int[] s2_2(int[] nums, int target) {
        Map<Integer, Integer> hashtable = new HashMap<Integer, Integer>();
        for (int i = 0; i < nums.length; ++i) {
            if (hashtable.containsKey(target - nums[i])) {
                return new int[]{hashtable.get(target - nums[i]), i};
            }
            hashtable.put(nums[i], i);
        }
        return new int[0];
    }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-04-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么要重视算法
  • 为什么说算法是程序员最应该学习的技能,没有之一
  • 思考一下,为什么面试都要考算法?
  • 为什么说算法会提高代码质量
  • 代码质量如何一步步提高
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档