场景
今天写了个程序,需要读取100W条数据到一个buff中。然后需要通过调用 string 类的 find_first_of成员函数来找到每条数据的分隔符。
刚开始的时候直接查找分隔符 , 最后发现查找的很慢很慢,最终发现如果我每次记录下前一个位置,基于前一个位置去查找这样就很快跑完了。
即
从
pos = buff.find_first_of('t');
改为
startpos = 0;
pos = buff.find_first_of(startpos,'t');
startpos = pos+1;
分析
如果是第一种写法,时间复杂度O(N^2) , 如果是第二种写法只遍历了一遍buff,时间复杂度O(N) 。
不起眼的一个小操作,这导致的效率是天差地别。
如果是100万条数据。N的二次方,将会遍历 1万亿次数据,这是不可接受的,即使在当前计算器如此发达的年代。
分析图
方法1
方法2
直接基于上一个位置开始查找,不再需要从头开始了