线性查找法优化
来源:2-7 简单的复杂度分析
阿阳2017
2023-01-30 08:46:43
老师你好,关于线性查找法,在一次循环中有2次比较,如果把数组空间的第0个位置空出来,1-n存储数据,就可以从后往前找,在0的地方放要查找的target,作为哨兵:
<> ([] datatarget) { i(i = data.!data[i].equals(target)--i)i}
这种方式是不是可以作为线性查找的优化?
1回答
liuyubobobo
2023-02-27
可能是慕课网的 bug,你的代码显示不全,我看不到你的完整代码,但我能大概理解你的意思。
几点:
1)
哨兵确实是一个常见的“优化”代码的方式(注意,我说的是优化代码,而非优化性能),这一点,在这个课程讲解链表的时候,你将看得更清楚(虚拟头节点本质就是哨兵。)
2)
你说的这种方式不常使用于数组。因为这就要求用户传来的数组必须完全按照你设定的格式,数据从 1-n 做存储,但是用户万一没有注意到这个规则怎么办?因此,你不会看到任何库函数提供类似这样的接口。数组就是数组,如果要传其他信息,就单独传其他信息。如果信息太多,就包装成结构体或者类或者设置某种特殊的文件格式。你可以在你的算法内对数据进行整理,但是这种对数据的整理应该是对用户隐藏的。
(用户不管你的算法内部怎么整理数据,用户就传来一个普通数组,你要是觉得有必要,把这个普通数组复制一份,然后想怎么整理怎么整理。但是,在这个例子中,这个开销将远大于你节省的开销。)
3)
学习算法的一个非常重要的 mindset 是:复杂度级别的优化远远大于这种程序语言内部实现细枝末节的优化。你不管如何优化线性查找法,线性查找法都拼不过二分查找;你不管如何优化选择排序插入排序,这些 O(n^2) 的排序算法都拼不过 O(nlogn) 的排序算法。
而且,具体语言上的优化,很多时候是语言相关,平台相关,甚至是 CPU 相关的。这种优化,有的时候在这个语言中是惯用的,但是换一个语言,就不管用了(因为编译器的差异),或者换一个机器就不管用了(因为处理器的差异,是否多核,是那种指令集,都会有影响)。所以这类优化通常不是我们学习算法关注的重点。
==========
对于现代编程来说,你说的这种优化(就算真的有性能优化的话),是不提倡的。因为其能优化程度很低,且不稳定(参见 3),但副作用明显,让用户难以使用,极大增加了潜在的出现 bug 的几率(参见 2))。
继续加油!:)
相似问题