TreeMap<> 操作的时间复杂度:get() 和 subMap()
Time complexity of TreeMap<> operations: get() and subMap()
基于此post,
Time complexity of TreeMap operations- subMap, headMap, tailMap
subMap()本身就是O(1),O(n)来自迭代子图
那么,为什么要使用 get(key) 呢?
我们可以使用 subMap(key, true, key, true) 代替,
这是O(1),迭代这个子图也是O(1)。
比 get(key) 更快,即 O(log(n))。这里有问题...
答案有点混乱。从技术上讲,创建子图确实是持续不断的操作。但这只是因为它实际上除了设置低调和高调之外什么都不做,并且仍然与原始树共享树结构。
因此,对树的任何操作实际上都被推迟,直到调用特定方法。那么接下来get()
还是遍历整个原图,只检查是否没有越过上下边界。简单地说 get()
仍然是 O(n)
其中 n
来自原始地图,而不是子地图。
We can use subMap(key, true, key, true) instead, which is O(1)
这是正确的
and iterating this sub map is also O(1).
O(n) 来自问题。答案并没有暗示这一点,这很好,因为它不是真的。
迭代子树的时间复杂度为O(log n + k),其中n
为整张图的元素个数,k
为子图的元素个数-地图。换句话说,当你开始迭代时,它仍然需要 O(log n) 才能到达第一个位置。查看 getFirstEntry()
实现以了解它是如何完成的。
这使您的方法的总体复杂性达到 O(log n),但它肯定比简单的 get
慢,因为在此过程中创建和丢弃了一个中间对象。
subMap 的构造需要 O(1) 时间,但是所有检索操作都需要与原始映射相同的 O(log n) 时间,因为 SubMap 只是包装这个对象并最终完成范围检查并委托调用get() 方法到原始源映射对象。
基于此post, Time complexity of TreeMap operations- subMap, headMap, tailMap
subMap()本身就是O(1),O(n)来自迭代子图
那么,为什么要使用 get(key) 呢?
我们可以使用 subMap(key, true, key, true) 代替,
这是O(1),迭代这个子图也是O(1)。
比 get(key) 更快,即 O(log(n))。这里有问题...
答案有点混乱。从技术上讲,创建子图确实是持续不断的操作。但这只是因为它实际上除了设置低调和高调之外什么都不做,并且仍然与原始树共享树结构。
因此,对树的任何操作实际上都被推迟,直到调用特定方法。那么接下来get()
还是遍历整个原图,只检查是否没有越过上下边界。简单地说 get()
仍然是 O(n)
其中 n
来自原始地图,而不是子地图。
We can use subMap(key, true, key, true) instead, which is O(1)
这是正确的
and iterating this sub map is also O(1).
O(n) 来自问题。答案并没有暗示这一点,这很好,因为它不是真的。
迭代子树的时间复杂度为O(log n + k),其中n
为整张图的元素个数,k
为子图的元素个数-地图。换句话说,当你开始迭代时,它仍然需要 O(log n) 才能到达第一个位置。查看 getFirstEntry()
实现以了解它是如何完成的。
这使您的方法的总体复杂性达到 O(log n),但它肯定比简单的 get
慢,因为在此过程中创建和丢弃了一个中间对象。
subMap 的构造需要 O(1) 时间,但是所有检索操作都需要与原始映射相同的 O(log n) 时间,因为 SubMap 只是包装这个对象并最终完成范围检查并委托调用get() 方法到原始源映射对象。