【问题标题】:build data structure using build insert and median使用构建插入和中值构建数据结构
【发布时间】:2021-12-02 08:52:01
【问题描述】:

考虑以下操作

Build(A[1 ...它的运行时间为 O(n)。

Insert(x):将元素 x 插入到数据结构中。它以 O(log n) 的时间运行。

中位数:返回当前存储元素的中位数1。它在 O(1) 时间内运行。

我如何描述一个数据结构,即提供一个我将在这个数据结构中维护的不变量? 如何编写 Build()、Insert() 和 Median() 的伪代码?

更新
构建最大堆/最小堆:

void build_maxheap (int Arr[ ])
    {
        for(int i = N/2 ; i >= 1 ; i-- )
        {
            max_heapify (Arr, i) ;
        }
    }

void build_minheap (int Arr[ ]) 
    {
        for( int i = N/2 ; i >= 1 ; i--)
        min_heapify (Arr, i);
    }

这都将在 O(n) 中运行。

插入:

void insert (int Arr[ ], int val)
    {
        length = length + 1;
        Arr[ length ] = -1;  
        increase_val (Arr, length, val);
    }

这将在 O(log n) 中运行。

中位数呢?运行时间 O(1)

【问题讨论】:

  • 请展示你自己对解决方案的尝试,而不是把你的作业丢在这里。更多详情请参考help center,但您所描述的是self balancing binary-search tree
  • 请提供Build()的详细信息。该建筑物是否包含 {5,5, 2,2, 9,9, 3,3, 5,5, 0,0, -1, -1} 之类的数据?
  • @OneCricketeer 如何在 O(n) 中初始化它?
  • 是的,我们假设所有元素都是从 1 到 10^6 的整数
  • @OneCricketeer 是的,刚刚意识到。不过,我仍然怀疑中位数总是在根部。

标签: algorithm data-structures median


【解决方案1】:

构建: 使用中位数的中位数在 O(n) 中找到初始中位数,用它将值分成两半。具有较小值的一半进入最大堆,具有较大值的一半进入最小堆,每个都在 O(n) 时间内构建。我们将保持两个堆的大小相同或最多相差一个元素。

中位数:较大堆的根,如果堆大小相等,则为两个根的平均值。

插入:插入到较大的堆中,然后弹出它的根并插入到较小的堆中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-17
    • 1970-01-01
    • 1970-01-01
    • 2013-12-10
    • 2018-12-05
    相关资源
    最近更新 更多