Top.Mail.Ru

Перечень алгоритмов

Python. Простые алгоритмы

Рассматриваются алгоритмы линейной обработки списков, строк - это последовательный поиск и  нахождение заданного значения, когда нужно просмотреть все элементы с первого до последнего. Как только будет найден элемент, равный заданному значению, необходимо вывести найденное значение и завершить поиск. Такой  алгоритм является простейшим алгоритмом поиска. Сложность поиска O(n).

В программировании «О» большое описывает наихудший сценарий. Допустим, у нас есть массив чисел, где мы должны найти какое-то определенное число при помощи цикла for. Оно может быть найдено при любой итерации, и чем раньше, тем быстрее функция завершит работу. О-нотация всегда указывает на верхнюю границу, т. е., описывает случай, когда алгоритму придется осуществить максимальное количество итераций, чтобы найти искомое число. Как, например, в том случае, если это число окажется последним в перебираемом массиве

Дан список

a = [12, 15, 2, 80, 40]

Способ № 1. Использование функции max():

mx = max(a)
print ("max=", mx )
# max= 80

Находится первый максимальный элемент.

Временная сложность: O (n)

 

Способ № 2. Использование метода sort():

Отсортируем список в порядке возрастания и выведем последний элемент в  списке

a.sort()
print ( "max=", a[-1] )
# max= 80

Выводится последний максимальный элемент.

Временная сложность: O (nlog n)

 

Способ № 3.Использование цикла for

В цикле просматриваем все элементы массива один за другим. Если очередной элемент массива больше, чем максимальный из предыдущих (находящийся в переменной mx), запомним новое значение максимального элемента в mх

  • В качестве начального значения переменной mx, в общем случае, необходимо брать значение первого элемента mx = a[0]
  • Если известно минимальное значение обрабатываемого массива, то переменной mx следует присвоить - значение нижней границы диапазона возможных значений

Вариант №1

mx = a[0]
for x in a:
  
if x > mx:
       mx = x
print ("max=", mx )
# max= 80

if a[i] > mx: находится первый   максимальный элемент.

if a[i] >= mx: находится последний максимальный элемент.

Временная сложность: O (n)

Вариант №2

mx = a[0]
for i in range(len(a)):
  
if a[i] > mx:
       mx = a[i]
print ("max=", mx )
# max= 80

if a[i] > mx: находится первый   максимальный элемент.

if a[i] >= mx: находится последний максимальный элемент.

Временная сложность: O (n)

Вы можете найти минимальный элемент списка, используя в рассмотренных способах функцию min(), функцию sort() или цикл for.

Дан список

a = [12, 15, 2, 80, 40]

 

Способ № 1. Использование сортировки

Отсортируем список в порядке возрастания и выведем предпоследний элемент в списке.

a = [12, 15, 2, 80, 40]
a.sort()
print("второй по величине=", a[-2])

# второй по величине= 40
Временная сложность: O (nlog n)

 

Способ № 2. Использование генератора списка

b = [x for x in a if x < max(a)]
print("второй по величине=", max(b))

# второй по величине= 40
Временная сложность: O (n)

 

Способ № 3.Использование функции enumerate()

mx=max(a)
b=[x
for i,x in enumerate(a) if x < mx]
print("второй по величине=", max(b))

# второй по величине= 40
Временная сложность: O (n)

 

Способ № 4.Использование цикла for функции max()

mx2 = 0
mx = min(a)
for x in a:
  
if x > mx:
       mx2 = mx
       mx = x
  
else:
       mx2 =
max(mx2, x)
print("второй по величине=", mx2)

# второй по величине= 40
Временная сложность: O (n)

 

Вы можете найти второе минимальной число списка, используя в рассмотренных способах функцию min(), функцию sort() или цикл for.

 

Способ 1. Использование цикла for и функции range()


 #   0  1   2   3  4   5   6   7     <-
индексы
a= [16, 19, 20, 1, 20, 18, 20, 18# <- список
mx = a[0]
imx1 =
0
imx2 = 0
for i in range(1,len(a)):
   
if a[i] > mx:        это первый максимум     20 2
       
mx = a[i]
        imx1 = i
   
elif a[i] == mx:     # это последний максимум  20 6
       
imx2 = i
print (mx, imx1, imx2)       #  20 2  или 20 6
# 20 2 6

Временная сложность: O(n),

 

Способ 2. Использование функции max() и срезов


# Первый максимум      20 2
print(max(a), a.index(max(a)))      
# Последний максимум   20 6
print(max(a), len(a)- 1 - a[::-1].index(max(a) ))

# 20 2

# 20 6

Временная сложность: O (1)

Дан список:

a= [1,2,3,4,5,6,7,8,9,0]

Способ 1. Использование цикла for


b=[]
for x in a:
  
if x%2==0:
       b.append(x)
print(b)

# [2, 4, 6, 8, 0]
Временная сложность:O (n)

 

Способ 2. Использование цикла while

b=[]
i =
0
while i < len(a):
  
if a[i]%2==0:
       b.append(a[i])
   i+=
1
print(b)

# [2, 4, 6, 8, 0]
Временная сложность:O (n)

 

Способ № 3. Использование генератора списка

b = [x for x in a if x %2==0]
print(b)

# [2, 4, 6, 8, 0]
Временная сложность: O (n)

 

Способ №4. Использование функции filter()

b = list(filter(lambda x: x %2 == 0, a))
print(b)

# [2, 4, 6, 8, 0]
Временная сложность: O (n)

 

 

Способ №5 использование функции enumerate()

b = []
for i, item in enumerate(a):
  
if item%2 ==0:
     b.append(item)
print(b)

# [2, 4, 6, 8, 0]
Временная сложность: O (n)

Дан список:

a= [1,2,3,4,5,6,7,8,9,0]

 

Способ №1. Использование генератора списка и функции max():

mx1 = max([x for x in a if x%2==0])
mx2 =
max([x for x in a if x%2!=0])
print("max четное", mx1)
print("max нечетное", mx2)

# max четное 8
# max нечетное 9

Временная сложность: O (n)

 

Способ №2. Использование функции filter()


mx1 = max(list(filter(lambda x: x %2 == 0, a)))
mx2 = max(list(filter(lambda x: x %2 != 0, a)))
print("max четное", mx1)
print("max нечетное", mx2)

# max четное 8
# max нечетное 9

Временная сложность: O (n)

 

Способ №3 использование функции enumerate()

mx1 = max([x for i, x in enumerate(a) if x%2==0])
mx2 =
max([x for i, x in enumerate(a) if x%2!=0])
print("max четное", mx1)
print("max нечетное", mx2)

# max четное 8
# max нечетное 9

Временная сложность: O (n)

  

Способ 4. Использование цикла for

mx1 = a[0]
mx2 = a[
0]
for x in a:
  
if x % 2 == 0 and x > mx1:
       mx1 = x
  
elif x % 2 != 0 and x > mx2:
       mx2 = x
print("max четное", mx1)
print("max нечетное", mx2)

# max четное 8
# max нечетное 9

Временная сложность: O (n)