2017-10-01 8 views
0

J'ai une fonction définie par l'utilisateur qui prend en entrée la taille de table (m). J'implémente une liste vide (de paires [clé, nombre], essentiellement un tableau avec deux champs) de cette taille et utilise le hachage linéaire pour insérer des nombres aléatoires générés dans la liste. Donc disons que le premier nombre aléatoire (k) est 20 et que la longueur de la liste (m) est 9, la fonction de hachage (h0 = k% m) retournera 2 (comme c'est le reste quand 20 est divisé par 9). Si cette cellule est vide, je veux insérer la valeur clé (k) dans le premier champ et 1 (nombre de sondes) dans le deuxième champ. Si cette cellule n'est pas vide, je veux incrémenter l'index en utilisant la fonction de hachage (h0 = (h0 + i)% m) jusqu'à ce qu'une cellule vide soit trouvée et insérée ici. Je veux retourner la liste résultante. J'ai une déclaration de retour dans ma fonction et la documentation que j'ai lue indique assigner une nouvelle valeur quand j'appelle la fonction et en utilisant une instruction d'impression devrait fonctionner. J'utilise l'édition communautaire de PyCharm. Mon IDE pourrait-il être le problème? (Ci-dessous est mon code)Ma fonction python ne retourne pas de valeur

import random 

def linear(m): 

hTable = [[None, None] for j in range (m)] 

for n in range (1100): 
    k = random.randint(1,10000) 

    for i in range(len(hTable)): 
     for j in range(len(hTable[i])): 
      h0 = k % m 

      if hTable[h0] == [None,None]: 
       hTable[h0][0] = k 
       hTable[h0][1] = 1 

      else: 
       while hTable[h0] != [None, None]: 
        hTable[h0][1] += 1 
        h0 = (h0 + i)%m 

       else: 
        hTable[h0][0] = k 
        hTable[h0][1] = 1 

        return hTable 

       hash = linear(1223) 
       print(hash) 
+0

J'ai oublié de mentionner quand je cours le manuscrit, je ne reçois aucune erreur de retour, mais je n'obtiens pas non plus la production désirée. Ma seule sortie est "Processus terminé avec le code de sortie 0" – Noelle

+0

Avez-vous simplement oublié d'appeler * votre fonction? Quelque chose comme 'linear (5)'. – ImportanceOfBeingErnest

+0

Vous effectuez une fonction len sur un objet de type None dans la ligne: 'pour j dans range (len (hTable [i])):'. Vouliez-vous configurer hTable comme un tableau à deux dimensions à la place? Si vous voulez que hTable soit bidimensionnel, vous pouvez faire: 'hTable = [[Aucun pour x dans la plage (largeur)] pour y dans la plage (hauteur)]'. J'espère que cela t'aides. – BKovac

Répondre

0
>>> [None,None]*2 
[None, None, None, None] 

En Python, la multiplication d'une liste étend la liste, il ne fait pas multidimensionnelle. Vous voulez probablement quelque chose comme [[None, None] for i in range(m).

(Je ne suis pas sûr de ce que fait votre code en général, car à la première itération tout va == [None, None] et provoquer l'exécution de votre bloc else - qui a un retour, et donc le tableau retourné de hTable[h0] = [k, 1] et tout autre élément [None, None] ...)

en outre, h0 auront la même valeur par chaque itération (car il est calculé à partir des valeurs qui ne sont changent pas) ... et que vous voulez probablement return hTable, pas [hTable] , puisque c'est déjà une liste.

+0

Lorsque l'enregistrement dans la liste est [None, None], l'instruction else insère "k" dans le champ de gauche et "1" dans le droit, car cette position a été sondée 1 fois. Comme je l'ai dit, c'est une fonction de hachage pour insérer des valeurs dans une liste vide. La fonction renvoie un index, k et count sont insérés si les cellules sont vides, sinon while utilise un hachage loop pour obtenir un nouvel index. "k" change chaque fois qu'un nouveau rand.un nombre est généré qui est "pour n dans la plage (1100)" fois. "return hTable" ne fonctionnait pas non plus. J'ai aussi changé l'implémentation de ma liste en "hTable = [[[] pour i dans la plage (2)] pour j dans la plage (m)]" alors merci pour ça – Noelle

0

Le problème était l'indentation de ma déclaration de retour. Les travaux suivants:

import random 

def linear(m): 

    hTable = [[None, 0] for j in range (m)] 

    nums = [random.randint(1,10001) for n in range(1100)] 

    for i in range(len(nums)): 
     h0 = nums[i] % m 

     while hTable[h0] != [None, 0]: 
      hTable[h0][1] += 1 
      h0 = (h0 + 1)%m 

     else: 
      hTable[h0][0] = nums[i] 
      hTable[h0][1] = 1 

    count = sum(i[1] for i in hTable) 
    print (count) 

    return hTable 

l = linear(1223) 
print(l)