針對一群範圍對的最快查詢演算法設計(不要用陣列)?

時間 2021-05-30 22:38:09

1樓:

假設區間是固定的。

統計下區間的比例,做個huffman tree。當然,我個人覺得這沒有本質變化,相比直接在陣列上二分查詢,huffman tree的實現恐怕就沒那麼快了。

可以把查詢合併起來(需要保證有序,當然,假定你能足夠快的合併它們)。多次查詢批量進行的話,平均到每次能到O(1)。但是你需要首先對批量查詢排序,如果條件合適的話(比如在某個範圍的整數空間上),也許能做到O(N)呢。

2樓:

這個問題等價於k近鄰搜尋。因此在僅考察單次查詢複雜度的情況下,O(log n)是基於比較的最優解法了。但是如果忽略預處理的時間複雜度與空間複雜度,實際上是存在更好的概率解的。

3樓:

樓主的評測可能是有問題的,資料量太小了,所以得出了map和順序查詢差不多的結論。

資料規模小了之後,順序查詢可能因為很好的資料區域性性。

不知道樓主的實際應用場景中的資料規模是多少?以及評測的編譯選項是?

以上只是推斷,等我也測測再來修改答案

4樓:

如果你的範圍是編譯前就確定的.可以考慮使用模板達到O(1)的效果.

#ifndef HI_MPL_INTMAP_H_INCLUDED#define HI_MPL_INTMAP_H_INCLUDED#include

"TypeList.h"

namespacehi;

enum

;enum;};

template

,typename

Range

>struct

is_in_range;};

template

,typename

TList

>struct

int_map_find

;template

,typenameT,

typename

...TList

>struct

int_map_find

typelist

...>>

;enum;};

template

>struct

int_map_find

nulllist

>;enum;};

}}#endif

// HI_MPL_INTMAP_H_INCLUDED上邊使用的"TypeList.h"你可以去以下找到:

使用c++11改寫loki的TypeListtypedef typelist< range2type<1, 2, 65>range2type<3, 37, 75>range2type<45, 159, 12>range2type<16000, 2000000, 23>> rangetable;

std::cout << int_map_find<16001, rangetable>::yes << " "lt;< int_map_find<16001, rangetable>::

value << std::endl;

5樓:

按照樓主的需求,二分查詢直接就搞定了,並且複雜度是下界。。。因為區間是靜態的,並且不相交(條件太強了),也沒有什麼動態更新的操作,線段樹、樹狀陣列RMQ神馬的根本沒有發揮的空間。。。

即使可以動態加減區間,只要滿足不相交,用個二叉查詢樹就好了,也不需要線段樹。

在一群傻子中的正常人和一群正常人中的傻子有什麼區別?

詩雨 個人看法,乙個正常人在一群傻子之中,他可能會有意識的知道自己和他們不一樣,大多數的人可能會有意識的模仿他們,而乙個傻子在一群正常人之中他不會去發現自己和其他人的不同,這也就導致了為什麼正常人在傻子群裡會變成傻子,而傻子在正常人之中還是傻子。以上僅代表個人看法 最可愛的崽 我只知道相同的就是大家...

有一群幸災樂禍的親戚什麼感覺

指尖若菸 合得來就是親戚,合不來就是陌生人。你這樣還算好的了,已經放棄親戚這種東西了,拿著親戚的名義干涉我家的事情,各種搶,想把我家吃光抹盡,真的笑死了。 勇者的天空 與其說幸災樂禍,不如說見不得你好,這種親戚不要也罷,有血緣關係的都有存在這樣的人,所以在道上遇到這樣的人,見怪不怪,世界千奇百態,看...

什麼時候你對身邊的一群人感到失望的?

屁兜 當發現他們突然有一天和自己聊天時思想不在一塊,高度不在一起,你說一句他們反駁一句,但你是知道自己是正確的,卻懶得和他們爭辯之時,會發現,對他們是如此之失望。 妍莨 用他們自己所謂的正義與傳統,開始對你的所思所想 所作所為指指點點時候。世界之大,三觀也不盡相同。你可以不理解,也可以不贊同,但請不...