Data Structures 尋找第k大

2022-08-03 07:48:14 字數 3096 閱讀 5580

對於bst,無壓力的可以,所以無需贅言,請見**。

1: program bst_kthfind(input,output);
2:   type point=^node;
3:        node=record
4:          data,leftsum,rightsum:longint;
5:          left,right:point;
6:   end;
7:   var ch:char;i,n,q:longint;flag:boolean;root:point;
8:   procedure insert(var p:point;x:longint);
9:     begin
10:       if p=nil

then

11:         begin
12:           new(p);p^.data:=x;p^.right:=nil;p^.left:=nil;p^.rightsum:=0;p^.leftsum:=0;
13:           if flag then

begin root:=p;flag:=false;end;

14:         end

else

15:       if x>=p^.data then
16:         begin
17:           insert(p^.right,x);
18:           inc(p^.rightsum);
19:         end
20:       else

begin

21:              insert(p^.left,x);
22:              inc(p^.leftsum);
23:            end;
24:     end;
25:   function find(p:point;x:longint):longint;
26:     begin
27:       if p^.leftsum=x-1 then exit(p^.data);
28:       if p^.leftsum>x-1 then exit(find(p^.left,x));
29:       if p^.leftsumthen exit(find(p^.right,x-p^.leftsum-1));
30:     end;
31:   begin
32:     readln(n);root:=nil;flag:=true;
33:     for i:=1 to n do
34:       begin
35:         read(ch);readln(q);
36:         case ch of
37:           'i' : insert(root,q);
38:           'f' : writeln(find(root,q));
39:         end;
40:       end;
41:   end.

另一種思路,是利用樹狀陣列。但這個東西侷限性很大,因為陣列c[i]表示的是比i這個數小的數的個數,也就是說出現了maxlongint大小的數字就無法處理了。大致思路如下

1: program problem1(input,output);
2:   var c:array[0..300000]of longint;
3:       n,i,tot,q:longint;ch:char;
4:   function lowbit(x:longint):longint;
5:     begin exit(x and -x);end;
6:   procedure add(p:longint);
7:     begin
8:       while p<=300000 do
9:         begin
10:           inc(c[p]);
11:           inc(p,lowbit(p));
12:         end;
13:     end;
14:   function find_kth(x:longint):longint;
15:     var i,ans,cnt:longint;
16:     begin
17:       ans:=0;cnt:=0;
18:       for i:=19 downto 0 do
19:         begin
20:           inc(ans,1300000)or(cnt+c[ans]>=x)then dec(ans,1
23:         end;
24:       exit(ans+1);
25:     end;
26:   begin
27:     readln(n);
28:     for i:=1 to n do
29:       begin
30:         read(ch);readln(q);
31:         case ch of
32:           'i' : begin add(q);inc(tot);end;
33:           'f' : writeln(find_kth(q));
34:         end;
35:       end;
36:   end.

Data Structures(一)順序表

線性表 在資料元素的非空有限集合中,除第乙個元素無直接前驅 最後乙個元素無直接後繼,集合中其餘每個資料元素都有唯一直接前驅唯一直接後繼。線性表有順序儲存結構和鏈式儲存結構兩種儲存方式。含有大量型別相同記錄的線性表稱為檔案或資料物件。但是乙個線性表中的資料元素必須屬於同乙個資料物件。因此線性表中相鄰元...

Data Structures 資料結構基礎

用計算機解決乙個具體問題時,一般要經過下列幾個步驟 首先要從具體問題抽象出乙個適當的數學模型,然後設計乙個解此數學模型的演算法,最後編出程式 進行測試 調整直至得到最終解答。尋求數學模型的實質是分析問題 從中提取操作的物件,並找出這些操作物件之間含有的關係,這實際上就是分析資料結構。資料結構是研究非...

Data Structures 06 單鏈表面試題

獲取到單鏈表中的有效節點個數 不包括頭節點 public static intgetlength heronode head int length 0 heronode cur head.next while cur null return length 獲取到單鏈表中的有效節點個數 public ...