这是我参与8月更文挑战的第13天,活动详情查看:8月更文挑战
算法对很多人来说的意义就是刷题,奈何现在找工作都要写算法,但平时工作又用不到,只好硬着头片去学习了。其实如果借此进入了大厂,依然可以不怎么用所谓的算法混上个2-3年不成问题。所以算法的意义是什么?今天先不讨论原子弹还是拧螺丝的问题,今天就讨论一下算法到底有没有用。
leetcode关于链表的算法第一题好像是链表的反转,刷到链表时可能很多人的第一反应是先学习一下链表的结构,然后多做题加深印象,慢慢就熟悉了,但在工作中还是几乎用不上。可能多少都会有类似的疑问,为什么工作的代码里几乎用不上呢?其实不然。我们先实现一个简单的单链表:
class Node<T> {
private T data;
private Node next;
public Node(T data){
this.data = data;
}
}
class LinkedList {
private Node head;
public LinkedList(Node head) {
this.head = head;
}
}
下面看一个简单的问题。
写一个方法,检查一个从外部系统给过来的用户列表,删除无效的用户。
这个实现起来真的很简单,我也见过无数个用ArrayList来实现的版本了。只不过ArrayList的remove不能和遍历同事进行,index会乱,这里有个小坑,但不是今天的重点。今天是要来分析,为什么用链表实现速度会更快。
首先进行一下复杂度分析:
- 遍历所有数据,这是数组和链表都跑不掉的,都是O(N)
- 用数组的话,每次删除我们就要另外再花O(N)步去左移后面的数据,以填补删除所产生的空隙
- 使用链表删除只需要一步O(1),毋需移动数据
这样都不用再做过多的解释,结果就显而易见了。实现起来也不复杂。
LinkedList<User> users = getUserList();
Iterator<User> it = list.iterator();
while (it.hasNext()) {
it.next();
if(cond) {
it.remove();
}
}
当数量到达一定量级时,使用数组和链表的差距会成倍增加。所以,链表有什么用呢?