簡體   English   中英

提取向量的最小值

[英]Extracting minimum of vector

我正在從向量中提取分鍾。

說向量= [0,inf,inf,inf];

ExtractSmallest(vector) = 0;

然后向量= [0,1,inf,inf];

但現在,我們已經看到了0。因此,

ExtractSmallest(vector) = 1;

我通過執行nodes.erase(nodes.begin() + smallestPosition);表示此代碼nodes.erase(nodes.begin() + smallestPosition);

但是,我現在意識到擦除非常不好。 有沒有辦法在擦除向量的情況下實現這一目標? 只是跳過我們已經看到的那些?

Node* CGraph::ExtractSmallest(vector<Node*>& nodes)
{


    int size = nodes.size();
    if (size == 0) return NULL;
    int smallestPosition = 0;
    Node* smallest = nodes.at(0);


    for (int i=1; i<size; ++i)
    {

        Node* current = nodes.at(i);

        if (current->distanceFromStart <
            smallest->distanceFromStart)
        {
            smallest = current;
            smallestPosition = i;

        }
    }

    nodes.erase(nodes.begin() + smallestPosition);      


    return smallest;


}

選項1您可以具有一個額外的vector<bool>在其上並行進行迭代。 當找到最小元素時,將bool向量中的該位置標記為true 每當您進行迭代時,都跳過兩個向量中標記為true

選項2如果順序不重要,請保持到目前為止已刪除元素的數量。 當找到最小值時,請與第一個未排除的元素互換頭寸。 在新的迭代中,從第一個未排除的元素開始。

選項3如果順序不重要,則對數組進行排序。 (這需要O(n*log(n)) )。 現在,刪除將采用O(1) -您只需排除第一個未排除的元素。

選項4如果沒有重復項,則可以在一側保留std::set並保留所有排除的元素。 迭代時,請檢查當前元素是否已被排除。

暫無
暫無

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

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