Алгоритм удаления повторяющихся элементов из массива, записанного в псевдокоде

#arrays #algorithm #pseudocode

#массивы #алгоритм #псевдокод

Вопрос:

я пытаюсь написать алгоритм, который удалит любой повторяющийся элемент из массива, переданного в качестве параметра. я изо всех сил пытался сделать это только с использованием массива в качестве параметра, поэтому я добавил еще один параметр, который будет размером массива.

я хочу, чтобы алгоритм удалял повторяющиеся элементы и возвращал массив с неповторяющимися элементами.

вот что я написал

 Algorithm RemDup(arr[0..n-1],k)

j<--0
m<--0
for i<--0 to i<k do
    for j<--i 1 to j<k do
        if arr[i]=arr[j]then
            for m=j to m<k do
                arr[m] = arr[m 1]
            endfor
            k<-- k-1
            j<-- j-1
        endif
    endfor
endfor
return arr
  

это правильный метод? и есть ли способ создать этот алгоритм, используя только массив, переданный в качестве параметра?

Комментарии:

1. Кажется правильным, хотя и не очень эффективным, его можно было бы значительно улучшить. Есть только одна ошибка: длина самого массива не уменьшается (только k), если вы находите дубликаты.

Ответ №1:

Если вы хотите удалить длину массива ‘k’ из параметра функции, вы можете прочитать длину массива внутри функции и присвоить ей значение ‘k’. Ваш алгоритм хорошо подходит для несортированного массива. Если это для отсортированного массива, вы можете удалить один цикл из своего алгоритма, как показано ниже. В приведенном ниже алгоритме я использовал тот же входной массив для хранения конечного результата. Таким образом, возвращая конечное значение индекса ‘j’ выходного массива (после удаления дубликатов).

Обратитесь к этой ссылке для подробного анализа: https://www.geeksforgeeks.org/remove-duplicates-sorted-array /

 Algorithm RemDup(arr[0..n-1])

k<--arr.length
j<--0

for i<--0 to i<k do    
  if arr[i]!=arr[i 1]then
  arr[j] = arr[i]
  j<--j 1
  end if
endfor
  

// Сохраните последний элемент как уникальный или повторяющийся, он ранее не сохранялся

     arr[j] = arr[n-1];  
return arr,j
  

Надеюсь, это поможет вашему вопросу.

Ответ №2:

В JavaScript распространенный способ удаления дубликатов заключается в следующем:

 console.log(
  [1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1]
  .filter((v, i, arr) => arr.indexOf(v) === i)
);  

Здесь вы перебираете массив, чтобы найти самое первое совпадение. Если его позиция не совпадает с позицией текущего элемента, то он должен быть дубликатом, и вы его игнорируете. В псевдокоде:

 Algorithm RemDup(arr[0..n-1],k)

i<--0
m<--0
while i<k do
    skip<--false
    for j<--0 to j<i do
        if arr[i]=arr[j]then
            skip<--true
            break
        endif
    endfor
    if skip do
        for m=i to m<k do
            arr[m] = arr[m 1]
        endfor
        k<--k-1
    else
        i<--i 1
    endif
endfor
return arr