Отображение эффективности сортировки с помощью линейного графика, а не гистограммы - PullRequest
1 голос
/ 09 июня 2019

Я пытаюсь проанализировать производительность сортировки слиянием в линейном графике, но все еще гистограмма показывает, как я могу реализовать график в линейном графике? Я использую увеличение цикла for на 100, поэтому сортировка слиянием может сортировать данные, увеличивая на 100. Я уже делаю случайный размер списка 10000 в L.

Tx = [0] * len(L) # time list

for i in range(0,len(L), 100):
    start_time = time()
    merge_sort(L[:i])
    end_time = time()
    elapsed_time = end_time - start_time
    Tx[i] = elapsed_time * 1000

plt.plot(Tx, label='merge_sort')

plt.xlim(100, 10000)
plt.ylim(1, 10000)
plt.xlabel("n")
plt.ylabel('ms')
plt.yscale('log')
plt.legend(loc = "upper left")

plt.show()

Ответы [ 3 ]

0 голосов
/ 09 июня 2019

Проблема заключается в следующем:

  • У вас есть одно ненулевое значение в вашем Tx. Остальные все значения равны нулю, для которых лог не определен. Таким образом, все выглядит хорошо в линейном масштабе, но когда вы строите график в логарифмическом масштабе по шкале y, появляется единственный пик для ненулевого значения, поскольку он связан с -inf, который является значением log (0). В результате он выглядит как бар.

Чтобы убедить себя, вы можете просто нарисовать маркер вместо линии, используя

plt.plot(Tx, 'bo', label='merge_sort')

enter image description here


Линейная шкала Y

Tx = [0.0019073486328125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

plt.plot(Tx, label='merge_sort')
plt.xlabel("n")
plt.ylabel('ms')
plt.legend(loc = "upper right")
plt.show()

enter image description here

Логарифмическая шкала Y

Tx = [0.0019073486328125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

plt.plot(Tx, label='merge_sort')
plt.xlabel("n")
plt.ylabel('ms')
plt.yscale('log')
plt.legend(loc = "upper right")
plt.show()

enter image description here

0 голосов
/ 09 июня 2019
import time
import sorting
import random
import matplotlib.pyplot as plt

arr=[]
time_array=[]
x_axis=[]

for i in range(0,1000):
    start_time = time.time()
    arr.append(random.randint(1,10000))
    k=arr.copy()
    sorting.mergeSort(k)
    end_time = time.time()
    elapsed_time = end_time - start_time
    time_array.append(elapsed_time * 1000)

print(time_array)

for i in range(0,1000):
    x_axis.append(i)

plt.plot(x_axis, time_array)

# naming the x axis
plt.xlabel('no of items')
# naming the y axis
plt.ylabel('time taken by mergesort')

# giving a title to my graph
plt.title('Mergesort graph')

# function to show the plot
plt.show()

ПОПРОБУЙТЕ МОЙ КОД, ПОЖАЛУЙСТА. enter image description here

Я добавлю картинку из 10000 предметов, когда мой компьютер закончит обработку. enter image description here Вы можете выполнить сортировку с помощью pip-установки, если у вас ее нет.

0 голосов
/ 09 июня 2019

Работает ли это для вас?

Tx = [0] * len(L) # time list

for i in range(0,len(L), 100):
    start_time = time()
    merge_sort(L[:i])
    end_time = time()
    elapsed_time = end_time - start_time
    Tx[i] = elapsed_time * 1000

plt.plot(Tx, '-', label='merge_sort')

plt.xlim(100, 10000)
plt.ylim(1, 10000)
plt.xlabel("n")
plt.ylabel('ms')
plt.yscale('log')
plt.legend(loc = "upper left")

plt.show()

С дополнительным аргументом в Plot это заставит его провести линию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...