06多次查詢某區間內topk問題

2022-07-03 15:00:21 字數 1346 閱讀 6660

題目描述:給定乙個陣列,需要多次查詢不同區間內的,

第k大或者第k小的元素。

考慮題目是多次查詢,如果採用只對查詢區間內的元素進行排序的思路,然後輸出第k大的數的策略,那麼下一次進行查詢時,還需要對另外乙個區間進行排序,再次查詢。而且,如果兩次查詢的區間有重疊區域的話,第一次排序時已經破壞了陣列,使得第二次查詢無法進行。

針對這種問題,思路之一是採用伴隨陣列的方法:首先,定義乙個結構體,乙個是陣列元素,另乙個是陣列原來的標號,記錄每個數在陣列的原順序。例子如下:

原陣列如下,第一次需要查詢區間[2, 5]中第3小的數(假設陣列下標以1開頭):

a[i].data   1 5 2 6 3

7 4a[i].num   1 2 3 4 5 6 7 

可以對整個陣列進行排序,然後得到的序列應該是(注:原下標始終保持不變):

a [i].data  1 2 3 4 5 6 7

a [i].num  1 3 5 7 2 4 6

如上,既然資料現在已經從小到大排好了,那麼,我們只需要進行一次檢索,從最小的數到最大的數,我們找第k(k=3)小的數,當我們發現下標a[i].num在區間[2,5]中的時候,k--,那麼當k==0的時候,我們也就找到了原區間內第k(3)小的數了。如下:

a [i].data           1 2 3 4 5 6 7

a [i].num           1 3 5 7 2 4 6

k                      3 2 1 1 0

所以,在原區間[2,5]中,第k(3)小的數是5。

**如下:

struct  node 

}; 

node  p[100001]; 

int  main() 

sort(p+1,p+1+n); 

for(j=1;j<=m;j++)  

printf("%d\n",p[i].data); 

}  return0; 

}  該演算法的時間複雜度,排序陣列需要o(n*lgn)的時間,查詢m次,需要o(mn)的時間,所以,總的時間複雜度為o(n*lgn + mn)。

06多次查詢某區間內topk問題

題目描述 給定乙個陣列,需要多次查詢不同區間內的,第k大或者第k小的元素。考慮題目是多次查詢,如果採用只對查詢區間內的元素進行排序的思路,然後輸出第k大的數的策略,那麼下一次進行查詢時,還需要對另外乙個區間進行排序,再次查詢。而且,如果兩次查詢的區間有重疊區域的話,第一次排序時已經破壞了陣列,使得第...

PostgreSQL列舉某區間內所有資料

一 簡介 postgresql 中有乙個很有用處的內建函式generate series,可以按不同的規則產生一系列的填充資料。二 語法函式 引數型別 返回型別 描述generate series start,stop int 或 bigint setof int 或 setof bigint 與引...

查詢任意區間內不同元素的個數

include using namespace std define ll long long const int maxn 2e5 5 const int mod 1e9 7 const double eps 1e 9 const double pi acos 1.0 const int inf ...