簡體   English   中英

如何比較兩個相等但一個按升序而另一個按降序排列的 arrays?

[英]How do I compare two arrays that are equal but one is in ascending order and other is in descending order?

int array1[] = {1,2,3,4,5};
int array2[] = {5,4,3,2,1};
if (std::equal(std::begin(array1), std::end(array1), std::begin(array2)))
    cout << "Arrays are equal.";
else
    cout << "Arrays are not equal.";

現在兩個 arrays 是相等的,但一個是上升的,另一個是下降的,所以帶有這個代碼的 output 是“數組不相等”,我們怎么能 Z78E6221F6393D1356681DB398F14CE6D “數組不相等”?

使用reverse_iterator

std::equal(std::begin(array1), std::end(array1), std::rbegin(array2))

如果您知道一個始終按升序排列,而另一個始終按降序排列,則很容易對一個使用正向迭代器,對另一個使用反向迭代器。

我的猜測是,倒序只是包含相同數據的一個示例,但順序不同,而且它們恰好都是升序,你仍然希望它們比較相等。 同樣,如果兩者都按隨機順序排列,但仍包含完全相同的元素,那么您也希望將其視為相等。

在這種情況下,您幾乎只能比較兩個輸入的排序副本。 從理論上講,您可以逐步完成一個,然后在另一個中搜索元素,但這很慢,並且需要非常小心才能正確(例如,除非您很小心,否則很容易最終得到一個說[1, 1, 2]等於[1, 2, 2] )。 更糟糕的是,即使你得到了這個非常正確的結果,你仍然會得到一個 O(N 2 ) 算法,如果你有很多元素,它會很快變得很慢。

所以,如果你真的需要支持這一點,最實用的方法可能是為每個輸入創建一個副本,對這些副本進行排序,然后將結果相互比較(盡管如果你可以對原件進行排序,那顯然減少 memory 的使用)。

如果您正在處理大型 arrays,您還可以考慮使用類似std::unordered_map的方式計算每個值出現的次數。 這將預期的復雜性從 O(N log N) 降低到 O(N),因此如果元素足夠多,它應該會更快(但究竟有多少足夠可能很難猜測,並且可能因實現而異)。

從 C++20 開始,您可以使用范圍工具將條件編寫為:

std::ranges::equal(array1, std::views::reverse(array2))

它更直接、更清晰地表達了意圖。

請參閱有兩種方法可以解決該問題。

  1. 對任何數組進行排序...例如。 對降序數組進行排序。 然后比較兩個 arrays。 但是排序 function 將花費 O(n log n) 時間。

  2. Traverse (Faster Approach) - 在這種方法中,讓有兩個數組 A1 和 A2。 因此,在 A1 中從索引 0 到 A1 的長度。 並在 A2 中從 A2 的長度移動到 0。如果元素相等,那么是的,兩個 arrays 具有相同的元素,否則沒有。

int array1[]= {1,2,3,4,5}
int array2[]= {5,4,3,2,1}

bool is_same = true;

for(int i=0; i<5; i++)
{
    if(array1[i] != array2[4-i])
    {
        is_same = false;
        break;
    }
}
if (is_same)
    cout << "Arrays are equal.";
else
    cout << "Arrays are not equal.";

暫無
暫無

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

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