Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 19-07-2012, 16:48   #1
ingframin
Senior Member
 
L'Avatar di ingframin
 
Iscritto dal: Apr 2010
Città: Leuven
Messaggi: 667
[python] quicksort

Qui di seguito c'e' la mia implementazione:

Codice:
def quicksort(V):
    l = len(V)
    if l<=1:
        return V

    else:
        ak = 0
        V1 = V
        V2 = V
        Z = V
        i1 = 0
        i2 = 0
        iz =0
        for x in range(l):
            
            if V[ak]>V[x]:
                V1[i1]=V[x]
                i1 += 1
            elif V[ak]<V[x]:
                V2[i2]=V[x]
                i2 += 1
            else:
                Z[iz] = V[x]
                iz += 1
        
        A1 = quicksort(V1[0:i1])
        A2 = quicksort(V2[0:i2])

        return A1+Z[0:iz]+A2
1) C'e' qualcuno che riesce a renderlo piu' veloce?
2) C'e' qualcuno che sa riscriverlo iterativo e non ricorsivo?
__________________
L'elettronica digitale non esiste, è solo elettrotecnica con interruttori piccoli!

Ultima modifica di ingframin : 19-07-2012 alle 17:06. Motivo: modificato leggermente il codice con una sola chiamata a len(V) invece di 2
ingframin è offline   Rispondi citando il messaggio o parte di esso
Old 19-07-2012, 23:07   #2
AnonimoVeneziano
Senior Member
 
L'Avatar di AnonimoVeneziano
 
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
Ciao.

Prima di pensare alle prestazioni mi concentrerei sulla correttezza dell'algoritmo, poichè lanciando questo codice (preso paro paro dal tuo post + inizializzazioni introdotte da me):

Codice:
import random

def quicksort(V):
    l = len(V)
    if l<=1:
        return V

    else:
        ak = 0
        V1 = V
        V2 = V
        Z = V
        i1 = 0
        i2 = 0
        iz =0
        for x in range(l):
            
            if V[ak]>V[x]:
                V1[i1]=V[x]
                i1 += 1
            elif V[ak]<V[x]:
                V2[i2]=V[x]
                i2 += 1
            else:
                Z[iz] = V[x]
                iz += 1
        
        A1 = quicksort(V1[0:i1])
        A2 = quicksort(V2[0:i2])

        return A1+Z[0:iz]+A2

def setit():
  a = [i for i in range(0, 20)]
  random.shuffle(a)
  return a

a = setit()
a2 = quicksort(a)
print a2
Il risultato è simile a questo:

[2, 2, 2, 4, 4, 5, 8, 8, 8, 4, 7, 7, 7, 8, 7, 7, 9, 9, 16, 16]
__________________
GPU Compiler Engineer
AnonimoVeneziano è offline   Rispondi citando il messaggio o parte di esso
Old 20-07-2012, 06:55   #3
ingframin
Senior Member
 
L'Avatar di ingframin
 
Iscritto dal: Apr 2010
Città: Leuven
Messaggi: 667
Quote:
Originariamente inviato da AnonimoVeneziano Guarda i messaggi
Ciao.

Prima di pensare alle prestazioni mi concentrerei sulla correttezza dell'algoritmo, poichè lanciando questo codice (preso paro paro dal tuo post + inizializzazioni introdotte da me):

Codice:
import random

def quicksort(V):
    l = len(V)
    if l<=1:
        return V

    else:
        ak = 0
        V1 = V
        V2 = V
        Z = V
        i1 = 0
        i2 = 0
        iz =0
        for x in range(l):
            
            if V[ak]>V[x]:
                V1[i1]=V[x]
                i1 += 1
            elif V[ak]<V[x]:
                V2[i2]=V[x]
                i2 += 1
            else:
                Z[iz] = V[x]
                iz += 1
        
        A1 = quicksort(V1[0:i1])
        A2 = quicksort(V2[0:i2])

        return A1+Z[0:iz]+A2

def setit():
  a = [i for i in range(0, 20)]
  random.shuffle(a)
  return a

a = setit()
a2 = quicksort(a)
print a2
Il risultato è simile a questo:

[2, 2, 2, 4, 4, 5, 8, 8, 8, 4, 7, 7, 7, 8, 7, 7, 9, 9, 16, 16]
Strano, mi sa che ho fatto qualche casino con le ultime modifiche, quello che avevo scritto prima funzionava... Dopo gli do un'occhiata, grazie della segnalazione :-)
EDIT:
Ho capito perché:
V1 = V
V2 = V
Z = V

Questo copia il riferimento, non il contenuto e quindi è come se ad ogni iterazione cambiassi il pivot e i vettori in base agli scambi che faccio.
Correggo e riposto
__________________
L'elettronica digitale non esiste, è solo elettrotecnica con interruttori piccoli!

Ultima modifica di ingframin : 20-07-2012 alle 07:11.
ingframin è offline   Rispondi citando il messaggio o parte di esso
Old 20-07-2012, 07:16   #4
ingframin
Senior Member
 
L'Avatar di ingframin
 
Iscritto dal: Apr 2010
Città: Leuven
Messaggi: 667
Codice:
def quicksort(V):
    l = len(V)
    if l<=1:
        return V

    else:
        p =V[0]
        V1 = [None for x in V]
        V2 = [None for x in V]
        Z = [p]
        i1 = 0
        i2 = 0
        iz =0
        for x in range(l):
            
            if p>V[x]:
                V1[i1]=V[x]
                i1 += 1
            elif p<V[x]:
                V2[i2]=V[x]
                i2 += 1
            else:
                Z.append(V[x])
                iz += 1
        
        A1 = quicksort(V1[0:i1])
        A2 = quicksort(V2[0:i2])
        #print(Z)
        return A1[0:i1]+Z[0:iz]+A2[0:i2]
Corretto
__________________
L'elettronica digitale non esiste, è solo elettrotecnica con interruttori piccoli!
ingframin è offline   Rispondi citando il messaggio o parte di esso
Old 20-07-2012, 07:53   #5
AnonimoVeneziano
Senior Member
 
L'Avatar di AnonimoVeneziano
 
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
Quote:
Originariamente inviato da ingframin Guarda i messaggi
[code]

Corretto
Il tuo algoritmo fa un po' troppe copie degli array.

Ho scritto una versione in-place del quicksort che è un po' più veloce della tua:

Codice:
import random
import time

def quicksort(V):
    l = len(V)
    if l<=1:
        return V

    else:
        p =V[0]
        V1 = [None for x in V]
        V2 = [None for x in V]
        Z = [p]
        i1 = 0
        i2 = 0
        iz =0
        for x in range(l):
            
            if p>V[x]:
                V1[i1]=V[x]
                i1 += 1
            elif p<V[x]:
                V2[i2]=V[x]
                i2 += 1
            else:
                Z.append(V[x])
                iz += 1
        
        A1 = quicksort(V1[0:i1])
        A2 = quicksort(V2[0:i2])
        #print(Z)
        return A1[0:i1]+Z[0:iz]+A2[0:i2]

def quicksort2_true(V, start, end):
  pivot = end
  low_pointer = start
  high_pointer = end-1

  while low_pointer <= high_pointer:
    while V[low_pointer] < V[pivot]:
      low_pointer = low_pointer + 1
    while V[high_pointer] >= V[pivot] and low_pointer <= high_pointer:
      high_pointer = high_pointer - 1  
    if low_pointer < high_pointer:
      temp = V[low_pointer]
      V[low_pointer] = V[high_pointer]
      V[high_pointer] = temp
      low_pointer = low_pointer + 1
      high_pointer = high_pointer + 1
  temp = V[pivot]
  V[pivot] = V[low_pointer]
  V[low_pointer] = temp

  if end - low_pointer  > 0:
    quicksort2_true(V, low_pointer, end)
  if high_pointer - start > 0:
    quicksort2_true(V, start, high_pointer)

def quicksort2(V):
  end = len(V)-1
  start = 0
  if end - start > 0:
    quicksort2_true(V, start, end)


def setit():
  a = [i for i in range(0, 2000000)]
  random.shuffle(a)
  return a

a = setit()
t1 = time.clock()
a2 = quicksort(a)
t2 = time.clock()
print 'Elasped: ', t2-t1, ' s'
a = setit()
t1 = time.clock()
quicksort2(a)
t2 = time.clock()
print 'Elasped: ', t2-t1, ' s'
quicksort() è la tua, quicksort2() è la mia.

Il risultato in velocità è (per 2000000 di elementi):

Codice:
MacBook-Pro-di-Marcello:~ Kariddi$ python qs2.py 
Elasped:  31.817912  s <-- quicksort()
Elasped:  18.748978  s <-- quicksort2()
Ciao
__________________
GPU Compiler Engineer
AnonimoVeneziano è offline   Rispondi citando il messaggio o parte di esso
Old 20-07-2012, 08:40   #6
ingframin
Senior Member
 
L'Avatar di ingframin
 
Iscritto dal: Apr 2010
Città: Leuven
Messaggi: 667
Era esattamente quello che volevo, sapere come andare piu' veloce
__________________
L'elettronica digitale non esiste, è solo elettrotecnica con interruttori piccoli!
ingframin è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
Un piccolo accessorio trasforma lo smart...
Dopo 370 anni il Cyphral Distich non è p...
Oppo Find X10, X10 Pro Max e X10 E: conf...
Dal microscopio all'IA: un cervello di i...
Cyberpunk 2077 arriverà su Battle...
Altro che divieto: interi pallet di GeFo...
QNAPTS-h966TX, il NAS per chi fa editing...
Il trucco semplicissimo per installare W...
Apple rinvia due novità di iOS 27...
Una memoria ferroelettrica raggiunge 10 ...
Honor Magic 9, Pro Max e Super Edition: ...
24 offerte Amazon da non perdere, dalla ...
Apple starebbe progettando i propri cont...
Niente borsa per OpenAI prima del 2027: ...
Meta potrebbe aver mostrato in anticipo ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 13:27.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v