簡體   English   中英

計算行間隔中的點數

[英]count number of points in line interval

我遇到了一個問題,需要程序計算一個間隔內的點數。 這個問題提供了大量未排序的點,並且lo,hi(限制lo <= hi),並且它旨在枚舉[lo,hi]內的點。 問題是雖然我的代碼是正確的,但是在給定時間(2200ms)內完成它太耗時。 我的代碼可以在O(n)中完成這個任務。 我想問一下是否有更快的方法。

 int n,m,c,lo,hi;
    cin>>n>>m;
    int arr[n];
    for(int i=0;i<n;i++){
        cin>>arr[i];
    }
    cin>>lo>>hi;
    c=0;
    for(int j=0;j<n;j++){
        if(arr[j]<=hi&&lo<=arr[j])c++;
    }
    cout<<c<<endl;

在不到O(n)時間內解決這個問題是不可能的,因為你必須至少考慮一次所有輸入。

但是,您可以減少n的常數因子 - 您是否考慮存儲一組(start, end)間隔,而不是簡單的數組? 什么是輸入大小導致這個慢?

編輯:經過進一步測試,似乎瓶頸實際上是使用cin來讀取數字。

嘗試替換cin >> x;每個實例cin >> x; with scanf("%d", &x); - 對我來說,這會使運行時間縮短到大約0.08秒。

只有在需要在同一數據集上多次查找時,才能比O(N)更快地執行此操作:

  1. 對數組或其副本進行排序。 對於查找,您可以使用二進制搜索 - 即O(log 2 N)復合體。

  2. 而不是使用像二進制樹這樣的平面數組,查找復雜性將與#1中一樣。

我試着把它作為一個評論發布,因為我剛剛回到編碼和C ++是很久以前的事了,但我還沒有成為這個社區的一部分,足以發表評論。

在我看來,您提供的代碼片段中唯一可管理的瓶頸是您循環一次以創建數組然后再次循環以檢查值。 是不是只能執行一次循環? 你讀的時候檢查一下嗎? 老實說,我不記得cin和cout很好; 我認為它們是高度優化的讀寫設施。 但是,對於使用效率較低的讀/寫並在一個循環內即時執行計算的設置來測試您的設置可能是值得的。

再次,抱歉將此作為答案發布,因為我實際上沒有回答這個問題。 很高興被允許做一個試用評論或類似的事情。

如果這個“答案”被低估或刪除或其他什么,我將不會被冒犯。

暫無
暫無

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

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