C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++のデータストリームから中央値を見つける


データストリームがあり、そのストリームにいくつかのデータ要素が来て参加する可能性があるとすると、データから中央値を見つけるのに役立つ1つのシステムを作成する必要があります。中央値は並べ替えられたリストの中央値であることがわかっているので、リストの長さが奇数の場合は中央値を直接取得できます。それ以外の場合は、中央値の2つの要素を取得して、平均を求めます。したがって、addNum()とfindMedian()の2つのメソッドがあり、これら2つのメソッドを使用して、ストリームに数値を追加し、追加されたすべての数値の中央値を検索します。

これを解決するには、次の手順に従います-

  • 優先キューを左右に定義する

  • addNumメソッドを定義します。これは数値を入力として受け取ります-

  • leftが空の場合、またはnum

    • numを左に挿入

  • それ以外の場合

    • 右にnumを挿入

  • 左のサイズ<右のサイズの場合

    • temp:=右の一番上の要素

    • 右からアイテムを削除

    • 左に温度を挿入

  • 左のサイズ–右のサイズ> 1の場合、

    • temp:=左の一番上の要素

    • 左からアイテムを削除

    • 温度を右に挿入

  • findMedian()メソッドを定義します。これは次のように機能します-

    • 左のサイズ>右のサイズの場合は左上を返し、それ以外の場合は(左上+右上)/ 2

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
typedef double lli;
class MedianFinder {
   priority_queue <int> left;
   priority_queue <int, vector <int>, greater<int>> right;
   public:
   void addNum(int num) {
      if(left.empty() || num<left.top()){
         left.push(num);
      }else right.push(num);
      if(left.size()<right.size()){
         lli temp = right.top();
         right.pop();
         left.push(temp);
      }
      if(left.size()-right.size()>1){
         lli temp = left.top();
         left.pop();
         right.push(temp);
      }
   }
   double findMedian() {
      return
      left.size()>right.size()?left.top():(left.top()+right.top())*0.5;
   }
};
main(){
   MedianFinder ob;
   ob.addNum(10);
   ob.addNum(15);
   cout << ob.findMedian() << endl;
   ob.addNum(25);
   ob.addNum(30);
   cout << ob.findMedian() << endl;
   ob.addNum(40);
   cout << ob.findMedian();
}

入力

addNum(10);
addNum(15);
findMedian();
addNum(25);
addNum(30);
findMedian();
addNum(40);
findMedian();

出力

12.5
20
25

  1. C++で左下のツリー値を検索

    二分木があるとします。そのツリーの最後の行の左端の値を見つける必要があります。したがって、ツリーが次のような場合- 最後の行が[7、4]であり、左端の要素が7であるため、出力は7になります。 これを解決するには、次の手順に従います- 最初にansとlvl変数を0として定義します solve()と呼ばれる1つのメソッドを定義します。これはツリーノードを取り、レベルは最初は0です。これは次のように機能します- ノードがnullの場合は、を返します。 lvlの場合、ans:=ノードの値およびlvl:=level 解決(ノードの左側、レベル+ 1)

  2. バイナリツリーのすべてのリーフノードをC++で右から左に印刷します

    この問題では、二分木が与えられ、二分木のすべてのリーフノードを右から左に印刷する必要があります。 問題を理解するために例を見てみましょう 入力 − 出力 − 7 4 1 この問題を解決するには、二分木をトラバースする必要があります。このトラバーサルは2つの方法で実行できます- プレオーダートラバーサル −このトラバーサルは再帰を使用します。ここでは、トラバース、ルート、左、右のサブツリーを作成します。リーフノードに遭遇した場合はそれを印刷します。それ以外の場合は、ノードの子をチェックし、それらを探索してリーフノードを見つけます。 例 ソリューションの実装を示すプログラム-