Программа Javascript для объединения 3 отсортированных массивов

Опубликовано: 2 Сентября, 2022

Даны 3 массива (A, B, C), отсортированные в порядке возрастания, нам необходимо объединить их вместе в порядке возрастания и вывести массив D.

Примеры:

Input : A = [1, 2, 3, 4, 5] 
        B = [2, 3, 4]
        C = [4, 5, 6, 7]
Output : D = [1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 7]

Input : A = [1, 2, 3, 5]
        B = [6, 7, 8, 9 ]
        C = [10, 11, 12]
Output: D = [1, 2, 3, 5, 6, 7, 8, 9. 10, 11, 12]

Способ 1 (два массива одновременно)
Мы обсуждали слияние двух отсортированных массивов. Таким образом, мы можем сначала объединить два массива, а затем объединить полученный результат с третьим массивом. Временная сложность объединения двух массивов O(m+n). Таким образом, для объединения третьего массива временная сложность станет O (m + n + o). Обратите внимание, что это действительно лучшая временная сложность, которую можно достичь для этой задачи.
Сложность пространства : поскольку мы объединяем два массива одновременно, нам нужен еще один массив для хранения результата первого слияния. Это повышает сложность пространства до O (m + n). Обратите внимание, что пространство, необходимое для хранения результата 3 массивов, игнорируется при вычислении сложности.

Алгоритм

function merge(A, B)
    Let m and n be the sizes of A and B
    Let D be the array to store result
   
    // Merge by taking smaller element from A and B
    while i < m and j < n
        if A[i] <= B[j]
            Add A[i] to D and increment i by 1
        else Add B[j] to D and increment j by 1

    // If array A has exhausted, put elements from B
    while j < n
        Add B[j] to D and increment j by 1
   
    // If array B has exhausted, put elements from A
    while i < n
        Add A[j] to D and increment i by 1
   
    Return D

function merge_three(A, B, C)
    T = merge(A, B)
    return merge(T, C)

Реализации приведены ниже

Выход:

[1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12]

Способ 2 (три массива одновременно)
Пространственная сложность метода 1 может быть улучшена путем объединения трех массивов вместе.

function merge-three(A, B, C)
    Let m, n, o be size of A, B, and C
    Let D be the array to store the result
    
    // Merge three arrays at the same time
    while i < m and j < n and k < o
        Get minimum of A[i], B[j], C[i]
        if the minimum is from A, add it to 
           D and advance i
        else if the minimum is from B add it 
                to D and advance j
        else if the minimum is from C add it 
                to D and advance k
    
   // After above step at least 1 array has 
   // exhausted. Only C has exhausted
   while i < m and j < n
       put minimum of A[i] and B[j] into D
       Advance i if minimum is from A else advance j 
   
   // Only B has exhausted
   while i < m and k < o
       Put minimum of A[i] and C[k] into D
       Advance i if minimum is from A else advance k
 
   // Only A has exhausted
   while j < n and k < o
       Put minimum of B[j] and C[k] into D
       Advance j if minimum is from B else advance k

   // After above steps at least 2 arrays have 
   // exhausted
   if A and B have exhausted take elements from C
   if B and C have exhausted take elements from A
   if A and C have exhausted take elements from B
   
   return D

Сложность: временная сложность равна O(m+n+o), так как мы обрабатываем каждый элемент из трех массивов один раз. Нам нужен только один массив для хранения результата слияния, поэтому, игнорируя этот массив, сложность пространства составляет O (1).

Реализация алгоритма приведена ниже:

Примечание. Хотя реализовать прямые процедуры для слияния двух или трех массивов относительно легко, процесс становится громоздким, если мы хотим объединить 4 или более массивов. В таких случаях мы должны следовать процедуре, показанной в Merge K Sorted Arrays.
Другой подход (не заботясь об исчерпывающем массиве):
Код, написанный выше, может быть сокращен приведенным ниже кодом. Здесь нам не нужно писать код, если какой-либо массив исчерпается.

Ниже приведена реализация вышеуказанного подхода:

Временная сложность: O(m+n+o), где m, n, o — длины 1-го, 2-го и 3-го массивов.

Пожалуйста, обратитесь к полной статье о слиянии 3 отсортированных массивов для получения более подробной информации!