emmmmmm,说出来不怕丢人。
昨天无意间刷 leetcode,发现一道题解法很妙,发现了新世界一样;今天做另一道题的时候发现 emmmmm,不是那么简单,还是得动动脑子的。 所以又对数据结构和算法在工作中的实际用途产生了困惑。
平时大多数时间在用 Array 原型链上的forEach,map,filter
等等,String 原型链,Object 原型链上的那一套,再搭配一些 es6+的Set(),...,Map
这种等等。
偶尔遇到一些稍微复杂的会用 lodash 里的函数或者 for for,对服务端返回的数据做一些处理以供渲染。
我写 PC 端的前端中后台系统,就是上面这些东西组合起来用,平时工作也够用了,性能也没啥问题。 如果是操作 DOM,基本上也是调 API,然后也很少有抓耳挠腮的感觉,一点一点能把需求做出来。 框架用的也算是蛮熟,接入第三方开源库也很快,源码也阅读过一些。
学校里也学过数据结构,基本上就是一些数组,二叉树,链表之类等等(当前工作里用到最多的就是数组了,可能是我太菜也可能是没必要用所以后面两个几乎没用过,所以基本上忘光了)。
偶尔刷刷 leetcode,起初是为了加深对 js 的语法的掌握,现在感觉语法啥的就那么回事,数据结构才更值得自己去深入学习一下,兴许以后写个什么复杂玩意儿就用上了。
其他语言我不太懂,但是感觉下面这些很大程度简化了一些前端在数据结构和算法上花费的时间:
还有太多太多了
最近想花时间补补这方面的知识了,不仅仅是应对以后的面试,更多的是想在工作中写出优雅的代码来,毕竟一直 if else + for for 迭代 感觉有点···
所以就想问问大佬们,你们在工作中用了什么数据结构,香不香?
今天距离发贴已经79天了。 记录一下自己在这段时间刷LeetCode卡片和题目的收获。
新学会的数据结构:栈、链表 新学会的算法:对撞指针、5种经典排序、二分、递归
在自己的github博客做了一些总结⬇︎
leetcode javascript repo:leetcode-js
做题目的过程中,巩固了很多js的常用方法,对js的运用也更加娴熟了
思考:熟练运用一门语言,对于学习数据结构和算法,或者是做实验有很大的帮助。
切身体会:
总而言之,在试图搞清楚数据结构和算法前,如果对语言的语法和特性掌握都不足够,不妨先磨磨刀,“磨刀不误砍柴工”。
1
tabris17 2020-03-26 15:16:33 +08:00
跳表
|
2
lithbitren 2020-03-26 15:25:43 +08:00 via iPhone
映射表建树,组件递归之类的,反正就是很简单的东西,但很多人找不到轮子就是写不出来,或者找了个乐色轮子改半天也不能符合要求。还有字符串处理,很多框架熟练工连正则都不会写,emoji 识别也写不出,都是巨简单的东西,再难也难不过 leetcode 中等题。
|
3
nekoneko 2020-03-26 15:30:54 +08:00
二叉树,表栈队列还是别忘的好,说不定哪天就用上了
|
4
Jacky23333 2020-03-26 15:30:59 +08:00 via Android
数组
|
5
nekoneko 2020-03-26 15:33:30 +08:00
比如说发一大堆消息时,会用到队列,但是又有了 vip 用户,svip 用户,要保证 svip 先于 vip 先于普通用户,这时候就要优先队列也就是大小顶堆了
|
6
fancy111 2020-03-26 15:33:48 +08:00
只刷困难题的飘过。。。 数据结构也就那么多,很多时候可以靠算法自建。
|
8
minglanyu OP @lithbitren 正则确实是字符串处理利器 框架熟练工不可怕 不知道自己是框架熟练工的才可怕
|
9
minglanyu OP @Jacky23333 数组是真的好用 233
|
11
isRealLeven 2020-03-26 17:05:35 +08:00
双链表
|
12
wellsc 2020-03-26 17:11:42 +08:00
万物皆可 map
|
13
Harv 2020-03-26 17:19:38 +08:00
正巧刚用环形队列写了个存储接收数据的程序。
|
16
Leonard 2020-03-26 17:22:25 +08:00
数组
|
17
minglanyu OP @isRealLeven 刚学了下单链表的双指针,还蛮好用 用双链表写了啥啊大佬
|
18
hauzi 2020-03-26 17:24:38 +08:00
数组最多啦
|
20
angryfish 2020-03-26 17:29:05 +08:00
数据结构用得很多,但都是库有的啊。list,set,map,不天天用,不用自己实现而已。
|
21
catinsides 2020-03-26 17:30:40 +08:00
想看“发现了新世界一样”的那道题
|
22
minglanyu OP @catinsides 我夸张了一下 哈哈
|
23
no1xsyzy 2020-03-26 18:44:47 +08:00
Dict[Tuple, Any] 真香
刷到动态规划题都直接继承 dict 写个 __missing__ 遇到计算顺序敏感的(即容易爆栈)再写个循环 touch 一下 result[X] 不追求极限速度就一遍过,反正 leetcode 的 Python 运行时本身连启动都很慢。 —— 稍微看歪了 想想,我发现我成天在改语法结构,改到静态检查器都不认了。 |
26
also24 2020-03-26 19:33:49 +08:00
我最喜欢的数据结构还是并查集,实实在在的拓宽了思路,以至于有些不是并查集的题目,我也会用并查集来做着玩儿~~
|
27
also24 2020-03-26 19:35:27 +08:00
另外,我最不喜欢的数据结构是 Trie 树,适用的场景相对比较少,对空间也比较浪费。
|
28
ackfin01 2020-03-26 19:44:13 +08:00
除了语言自带的那些数据结构,还会用下面的
- 栈,队列 - 链表:也很常用,用过双向循环链表在 LRU 缓存里, - 树:常用在搜索,二叉树是最基本的,还用过矩形树 - 图->最常用的:DAG,是否有环 还有很多算法真的是很有用,比如双指针,dfs,bfs,动态规划等 其实总结一下,就是遇到一个问题进行分析的时候,就会考虑这些可能的数据结构和可能的算法实现,哪种应用起来最符合,使得问题简化效率提高,简化不仅是实现上,代码可读性上,还有运行效率上。 |
29
bruce2000 2020-03-26 20:02:22 +08:00
我除了 list 和 dict 啥也不会,最复杂的也就是 list 与 dickt 的各种嵌套,楼上的大佬说的我一脸懵逼
|
30
jingcoco 2020-03-26 21:04:49 +08:00 via Android
大部分程序员不需要 CS 证书,广度很重要在小公司,基本要求你啥都做。我自己主要是也像楼主一样想提高所以自己有看些。
|
31
tingyunsay 2020-03-26 21:47:07 +08:00
布隆过滤器,个人小项目去重首选
|
32
changz 2020-03-26 22:13:24 +08:00 via Android
优先队列
|
33
yangzhezjgs 2020-03-26 23:33:05 +08:00
其实数据结构和算法使用最多的是底层的系统软件领域,一般应用开发还是 if eslse 这样的业务逻辑多
|
34
xiaochun41 2020-03-27 09:31:41 +08:00
基本很少自己实现,用的最多的大概是:队列
|
35
zjbztianya 2020-03-27 09:43:15 +08:00
@also24 web 框架的路由一般不就是用 trie 么?虽然是压缩前缀的(radix trie)...
|
36
minglanyu OP |
37
minglanyu OP |
38
RedisMasterNode 2020-03-27 09:53:32 +08:00
@tingyunsay 小项目去重应该直接 set()精确, 大项目才应该用 BloomFilter ?
|
39
tingyunsay 2020-03-27 10:57:18 +08:00 via iPhone
@RedisMasterNode 对,实际情况得看数据量吧,可能我自己搞得那些项目量还比较大,所以习惯用 bloom 了😹sorry 有点以偏概全了
|
40
jon 2020-03-27 11:01:28 +08:00
战马
|
41
Hardrain 2020-03-27 11:05:02 +08:00 via Android
数组
双链表 AVL 树 |
42
971586331 2020-03-27 13:44:37 +08:00
用的最多的是队列,链表和树,图还没用过
|
43
neilq 2020-03-27 14:08:28 +08:00
list,set,map, dictionary 之类就不说了到处都用,其他用的最多的还是队列,用来做消息处理、任务处理、循环任务之类的场景还是蛮多的。其次是树,什么菜单、组织架构。图,几年 crud 生涯只用过 2 次还是 3 次,基本都用映射表来做的
|