Algorithm 给出一种预处理方法,使您可以在O(logn)中查看任意方向

Algorithm 给出一种预处理方法,使您可以在O(logn)中查看任意方向,algorithm,Algorithm,假设你有一本从AA到BB的字典。单词按AA按字母顺序排序(即所有单词按AA排序,BB中对应的单词按AA排序)。有没有可能设计出find_BB()和find_AA()的方法,分别在AA和BB中获取一个单词,并分别在O(logn)时间内返回BB和AA中相应的单词 我知道,如果单词是按AA排序的,那么find_BB()至少是可能的,因为我们可以使用二进制搜索来查找相应的BB(我们知道这在O(logn)时间内运行)。然而,我似乎想不出一种方法来安排字典,允许对find_BB和find_AA进行O(log

假设你有一本从AA到BB的字典。单词按AA按字母顺序排序(即所有单词按AA排序,BB中对应的单词按AA排序)。有没有可能设计出find_BB()和find_AA()的方法,分别在AA和BB中获取一个单词,并分别在O(logn)时间内返回BB和AA中相应的单词


我知道,如果单词是按AA排序的,那么find_BB()至少是可能的,因为我们可以使用二进制搜索来查找相应的BB(我们知道这在O(logn)时间内运行)。然而,我似乎想不出一种方法来安排字典,允许对find_BB和find_AA进行O(logn)查找。甚至可能吗?

你在问是否可以有一张允许向前和向后查找的地图。这可以通过保留两张地图来实现:一张从AA到BB,另一张从BB到AA。如果您使用排序列表来实现映射,那么您的查找都是O(logn),或者如果您使用两个哈希表,那么两个查找都是O(1)。

我要提到的第一件事是,在排序的字符串数组中执行二进制搜索将花费比O(logn)更多的时间,因为字符串比较本身不是常数

其次,您没有发布任何内存使用限制。严格来说,有两个排序数组,一个用于AA->BB,一个用于BB->AA将解决您的任务。如果需要,可以将这两个数组封装在一个数据结构中


最后一个。您是否考虑过更高效的数据结构,例如?可以为AA和BB中的元素构造单个trie,每个叶最多存储两个值。如果叶是AA的键,则存储相应的BB值(标记为BB),反之亦然。

我不理解这种情况。你所说的“一本从AA到BB的字典”是什么意思?AA和BB是什么?话?一套单词?我的最佳猜测是,您希望通过两个元组对单词对进行索引。在这种情况下,您可以添加冗余。复制数组并按AA对其中一个副本排序,另一个按BB@NiklasB. 这正是他的意思,他有一种hashmap,用集合AA中的单词索引集合BB中的单词。如果AA和BB是不相交的,为什么不存储两个字典的并集呢。如果不是,只需存储两个字典,用于双向映射。@AshuPachauri你怎么知道这是什么意思?@NiklasB。没有人可以:)只是从他写的内容来看,我很清楚。我不得不提到,对于使用字符串键的映射,哈希表并不是最有效的数据结构。在哈希表中搜索的摊销成本为O(1)。不考虑字符串比较的非常量成本。有一些结构是为这个特殊的任务设计的——还有其他的基数T。