在Redis中,我们常说在内存中的操作用的是hash表,时间复杂度是O(1),那么这个O(1)是怎么意思?
感性理解:
O(1) 就是无论算法中的变量怎么变化,算法所耗费的时间总是固定的。比如说hash表,查找元素。
O(n) 就是该算法所耗费的时间是随着变量正比相关的,当变量越大的时候,所耗费的时间就越大。比如说一层for循环。
O(n2) 就是该算法所耗费的时间是随着变量n2相关的,当变量越大的时候,所耗费的时间就越大。比如说两层for循环。
O(n)再举例:IO复用模型实现之一 Linux中的select。
它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。所以select具有O(n)的无差别轮询复杂度,同时处理的流越多,无差别轮询时间就越长。
比如说,一位老师要检查全班所有学生的作业,当有学生写完之后,就通知老师作业写完了,但是没有告诉老师是谁写完了。老师只能到教室挨个学生问下,“是你写完作业了吗”....“是你写完作业了吗”....直到把全班的同学都问一遍才知道都有谁写完了。
这种方式的缺点显而易见,当随着学生的曾加的时候,老师的工作量也是呈线性增长。
所以,select算法的时间复杂度为O(n)
O(1) 再举例:IO复用模型实现之一 Linux中的epoll
epoll会把哪个流发生了怎样的I/O事件主动进行告知,这样后面的系统就不会再去轮询。
还是用上面老师检查学生作业的例子,当有学生写完作业之后,主动举手报告,老师就直接过来检查该学生的作业。
这种情况下,无论学生的数量增加多少,老师检查一位学生作业的时间仍然是不变的。
所以,epoll算法的时间复杂度为O(1)
参考文章:
时间复杂度:O(1)、O(n)、O(n²)、O(nlogn)等是什么意思,白话文解释专业术语