当我想根据两个键排序时,如何获得O(logn)

How do I get a O(log n) when I want to sort according to two keys?

本文关键字:排序 何获得 logn 两个      更新时间:2023-10-16

我有一堆节点,按照数据的字母顺序排列在红黑树中。

struct node {
    int counter = 1;
    string data = nullptr;
    int red = 0;
};

我使用了一个平衡的二叉树,因为它有一个大的O(logn)。

如果我尝试插入一个节点,并且数据与任何一个子节点和/或根节点匹配(并且节点没有插入),则节点的计数器会增加。

我想打印出从计数器开始按降序(从高到低)排列的前n(比如说10个)节点。但是,由于节点是根据数据按字母顺序排序的,而不是按计数器排序的,所以我能想到的在未排序列表中搜索的最佳情况是O(n),最坏的情况是使用选择或顺序搜索。

这将使我的大O变成O(n+logn),本质上是一个大O(n)——我希望更快地实现一些目标。

我的问题是,我如何才能实现我想要的大O,也就是说,任何事情,比O(n)更快?

在二叉树中按data排序的数据就像在一个数组中对基于count的查询没有特定顺序一样。因此,对于单个查询,您不能做任何比线性更好的事情。如果您计划多次执行查询,那么按计数器排序一个替代结构可能是值得的。如果您所需要支持的只是查询前10名,那么二进制堆将非常有用。如果您计划只执行几个查询,那么性能不会提高太多。