題目描述:給定乙個陣列,需要多次查詢不同區間內的,
第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 ...