我是分别用 st.inset插入25w个整数,然后再用st.count与x匹配 x是我输入的值
另外是把25w个数据复制到数组f[] 然后用二分查找匹配。。。。两种算法提交后 前者共耗时2600ms 空间9000kb 后者 耗时600ms 内存2000kb。。。。想问问具体为什么 据说set的查找也是二分。。lgn复杂度
好吧谢谢您。。我忘了 提到 set里面是每次插入都有自动排序。。。而我在数组方面是先全部赋值完成再用sort排序。
那么我那样使用set和二分查找造成的时间和空间的差别 是 因为 处理输入数据时,红黑树的插入过程每次都排序吗
空间差别:红黑树是树,不仅仅需要存储你给的值,还要存储树所需的其他信息,比如子节点,父节点的地址,节点颜色。
时间差别:红黑树并不是每次都需要排序,但是会在有些情况下对树进行调整,红黑树的插入策略还是有点小复杂的,你需要专门的研究。
顺序表并不适合不断的插入。理由如下:即使你一直保证顺序表有序,那么当你使用二分查找找到需要插入的点的时候,进行数据插入,插入时候你不得不对后面所有的数据往后移动一格。当数据很大,移动大量的内存开销很大的。所以不适合插入。此外,当对数据进行删除,又要对大量内存向前移动一格。相比之下,红黑树的插入,删除性能就好很多。
谢谢。最后一段,set更适合不断地插入,然后随时查找。。。
比较起 每次往数组赋值一个数,然后sort排序。。然后二分查找。。这两种效率应该一样吧。
而我的 问题中 出现时间空间有差别应该是因为 前者是每次插入都排序。而后者只全部输入完成之后一次排序。吧
向数组插入的复杂度是N(先用二分查找确定插入位置,然后把内容向后挪)。你说的加进去再排序的复杂度是N*logN,也就是排序的复杂度。向set插入的复杂度是logN。显然前者比后者慢太多了。即便向set插入一次循环的时间是排序一次循环的100倍。元素超过100个的时候排序就比set慢了。我那个方法元素超过1000个也开始比set慢了。(而且注意,其实set插入也没慢到100倍上)
复杂度差一级是很可怕的,你的情况之所以它们两个的单次循环性能会影响结果,因为时间复杂度是一样的。
另外更正我上面一个很脑残的笔误,排序最坏情况下是N^2不是什么logN^2。