2 votes

Comportement étrange sur une liste de 100000 éléments

J'ai rejoint le cours en ligne de Standford sur la conception d'algorithmes et je suis en train de résoudre la première question de programmation.

El fichier contient les 100 000 entiers compris entre 1 et 100 000. (y compris les deux) dans un ordre aléatoire (aucun entier n'est répété). Votre tâche tâche est de trouver le nombre d'inversions dans le fichier donné (chaque ligne a un seul nombre entier entre 1 et 100 000). Supposons que votre tableau aille de 1 à 100 000 et la i-ème ligne du fichier vous donne la i-ème entrée du tableau. tableau.

Mise à jour : J'ai constaté que mon code ne fonctionne que pour le cas 2^n. Le problème est dans le code, pas dans Python. J'ai mis à jour le code, maintenant il fonctionne bien et j'ai fait le quiz. Merci à tous ceux qui ont aidé

Le code fixe est :

 def merge_count_split (a, b):
        c = []
        inv = 0
        i=0
        j=0
        for k in range( len(a) + len(b) ):
                if i < len(a) and j < len(b):
                        if a[i] < b[j]:
                                c.append(a[i])
                                i += 1
                        elif a[i] > b[j]:
                                c.append(b[j])
                                inv += len(a)-i
                                j += 1
                elif i == len(a):
                        c.append(b[j])
                        j += 1
                elif j == len(b):
                        c.append(a[i])
                        i += 1
        return c, inv

def count_inv (data):
        n = len(data)
        if n == 1:
                return data, 0
        a, x = count_inv(data[:n/2])
        b, y = count_inv(data[n/2:])
        c, z = merge_count_split(a,b)
        return c, x + y + z

with open('IntegerArray.txt') as f:
        array = [int(line) for line in f]
        print count_inv(array)[0]

Ce programme fonctionne bien pour les petits tableaux, mais pour le grand tableau de la question, il imprime un tableau de 65536 les nombres dans le bon ordre, et non 100000, comme je m'y attendais. Il omet des chiffres à des endroits aléatoires.

Quelle est la raison de ce comportement inattendu de python ?

2voto

senderle Points 41607

En fixant n = len(a) et de fusionner uniquement n * 2 fois, vous tronquez b si elle est plus longue que a .

Cela explique en partie le fait frappant que vous avez 2 ** 16 éléments dans la liste résultante.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X