Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [Python] Problemi con code con priorità

    Salve, sto cercando di implementare delle code con priorità tramite heap secondo il procedimento descritto qui, ma, provando l'operazione di dequeue ho qualche problema che non riesco a spiegare; il codice che ho scritto è questo:
    codice:
    import copy
    def pr_ify(j,l,r): 
        tempq,tempp=copy.deepcopy(q[j]),j
        while j>l and pr[q[j]]<pr[q[j/2]]: #la priorità dell'i-esimo 
    #elemento dello heap è minore di quella del padre
            q[j]=copy.deepcopy(q[j/2]) #l'elemento che si trovava 
    #in posizione j viene spostato in posizione j/2
            p[q[j]]=j/2 #l'indice nell'array arr dell'elemento che
     #occupa nello heap la posizione j è ora quello del padre
            j/=2
        q[j]=tempq
        p[q[j]]=tempp
    #credo che il problema sia in questa parte
        while j<=r/2:
            ch=2*j
            if ch<r and pr[q[ch+1]]<pr[q[ch]]:
                ch+=1
            if pr[q[j]]<=pr[q[ch]]:
                break
            q[j]=copy.deepcopy(q[ch])
            p[q[j]]=ch
            j=ch
        q[j]=tempq
        p[q[j]]=tempp
    
    def pr_ins(j,prj): 
        q[0]+=1
        q[j]=copy.deepcopy(q[0]) #l'elemento aggiunto è l'ultimo dello heap
        p[q[0]]=j 
        pr[j]=prj]
        pr_ify(1,q[0],q[0])
    def pr_out():
        mn=q[1]
        if q[0]<=0:
            return -1
        q[1]=q[q[0]]
        q[0]-=1
        p[q[1]]=q[0]
        pr_ify(1,1,q[0])
        return mn
    Ho provato a testarlo con questo codice, ma mi risulta che la proprietà per cui [q[p[i]]=i e p[q[j]]=j sia violata e anche l'estrazione del minimo non funzioni
    codice:
    a=[4,"a","b","c","d"]
    pr=[4,3,1,5,0.5] #problemi con l'ultimo
    p,q=[0,1,2,3,4],[0,1,2,3,4]
    i=1
    for x in a[1:]:
        pr_ins(i,pr[i])
        ii=1
        for x in q[1:q[0]+1]:
            print ii,p[ii],q[p[ii]],p[q[ii]]
            print q[p[ii]]==ii
            print p[q[ii]]==ii
            ii+=1
        i+=1
    out=pr_out()
    while out!=-1:
        out=pr_out()
    Grazie in anticipo

  2. #2
    P.S.: q[0]=len(q)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.