从事业务开发的同学经常会抱怨经常面试要刷算法,实际上平常的开发99%以上的事情都不会用到。
实际情况确实是这样。平常在写业务逻辑代码时,几乎完全不需要。
当然有些技术原理在背八股文的时候,懂一点算法能帮助你更好的理解。
而有些特殊业务场景,懂一些算法,确实能帮助你很好的解决问题。
下面举两个业务中产品提出的需求作为例子,简单描述如何利用算法有效解决。
一、从题库(50道题)中随机抽出10道题,且不能重复
最简单的思路:
- 循环10次,每次取50以内的随机数
- 创建一个hashmap,判断生成的随机数是否在map存在,存在则重新生成
- 这个方法的缺点时,极端情况下,会多次生成重复的随机数导致要不断重新生成
经过一番思考,我设计了一下从m个数中取n个数的算法(m>n), 保证算法只会循环n次
那时我还是使用Java进行开发
1 | public static int[] randomArr(int m, int n) { |
- 后面我才发现原来这个算法叫 洗牌算法(Shuffle Algorithm),或者叫随机乱置算法。
通过搜索关键字匹配对应的标签id
产品提供了400个标签名称以及对应的标签id,希望能通过搜索的方式找到最相似的标签id,希望能支持模糊匹配
一般思路:
- 方案1:
- 将400条数据一次性加载的程序内存
- 遍历数据400条使用字符串的contains方法,找到第一条匹配数据就跳出,否则继续
- 方案2:
- 直接将数据导入到ES搜索引擎,利用ES自带的分词等搜索功能
- 通过调ES,搜索得到标签id
- 方案1:
简单分析方案:
- 方案1,性能太差,极端情况需要遍历所有数据
- 方案2,需要新搭建ES集群,实现代价比较高
经过一番思考,以及从产品本身实际需求上出发,我涉及出以下的方案
- 将数据的标签名字使用中文分词库gse进行分词
- 将分词和对应的标签数据,构建前缀匹配树
- 当搜索时,使用提前构建好的前缀匹配树,即可快速找到对应的标签id
这时我已经转使用Go来开发了
1 |
|
- 这个算法就是经典的Trie字典树(前缀树),如果我之前没了解过这些算法,可能一时间没那么快能想到用这个方式高效完成这个需求。
总结
- 了解一些算法,在实际业务开发,有时候也能运用到。
- 另外,现在处于AI时代,即时不了解算法,善于组织语言和上下文,向AI提问,基本它也能引导你找到合适的解决方案。