簡體   English   中英

我在優化我的代碼時遇到了一些麻煩。 某些測試用例由於“超過時間限制”而失敗。 如何優化我的代碼?

[英]I am having some trouble to optimize my code. Certain test cases are failing due to “exceeded time limit”. How can I optimize my code?

我試圖在 Hackerrank 中解決一個問題。 我通過了所有示例測試用例,但由於“超過時間限制”錯誤,無法通過所有隱藏測試用例。 問題問題的鏈接是: 欺詐活動通知

我的代碼如下。

#include <bits/stdc++.h>

using namespace std;

vector<string> split_string(string);

// Complete the activityNotifications function below.
int activityNotifications(vector<int> v, long int d) {
  long int n,ex;
  long double m;
  long int cap=v.size();
  long int notif=0;
  n=d;
  for(long int i=0;i<n&&n<cap;i++,n++)
  {
    ex=v[n];
    sort(v.begin()+i, v.begin()+i+d);
    if(d%2==0)
    {
        m=(v[(n+i-1)/2]+v[(n+i)/2])/2.0;
    }
    else
    {
        m=v[(n+i)/2];
    }
    if((m*2)>=ex)
    {
        notif++;
    }
  }
  return (notif-1);
 }
  int main()
  {
    vector<int>v;
    long int n,d;
    long int item;
    cin>>n>>d;
    for(long int i=0;i<n;i++)
    {
        cin>>item;
        v.push_back(item);
    }
    int res=activityNotifications(v,d);
    cout<<res;
    return 0;   
   }

如何優化此代碼? 請幫忙。

目前,每一步都需要使用O(dlogd)時間進行排序,因此總時間約為O(ndlogd)

你必須盡量減少中位數的時間。 有一種使用最小和最大堆( 示例)的方法來處理當前時刻的所有數據。 中位數是奇數d較大堆上的元素,偶數d是兩個堆頂部的平均值。

但是你需要滾動 window 的中位數。 所以可能的補充:使用指向堆節點的引用/指針制作並行數據結構ref[] (以循環方式工作的列表/數組)。 當索引離開 window (大小為d )時,從堆中刪除相應的節點,然后添加具有新值的新節點並更新堆和ref

每一步只需要O(logd)時間

更新:似乎這個主題包含很多rolling window median方法的鏈接和描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM