• Aucun résultat trouvé

Corrigé du DS Info n°2 2018

N/A
N/A
Protected

Academic year: 2022

Partager "Corrigé du DS Info n°2 2018"

Copied!
6
0
0

Texte intégral

(1)

CORRIG´ E DS n°2 (X PSI 2015)

1 import random

2 from math import exp, log

3

4 ############

5 # Partie I #

6 ############

7 import random

8 from math import exp, log

9

10 ############

11 # Partie I #

12 ############

13

14 # ---

15 # Question 1

16 # ---

17

18 def creerListeVide(n):

19 # Si l'on utilise la proc´edure de l'´enonc´e:

20 # lst = creerTableau(n+1)

21 # En Python:

22 lst = [None] * (n+1)

23 lst[0] = 0

24 return lst

25

26 # ---

27 # Question 2

28 # ---

29

30 def estDansListe(lst, x):

31 # Bien sˆur, on n'a pas le droit d'utiliser la fonction in de Python!

32 for i in range(1, lst[0]+1):

33 if lst[i] == x:

34 return True

35 return False

36

37 # Cette fonction est de complexit´e O(m), o`u m est le nombre d'´el´ements de

38 # la liste

39

40 # ---

41 # Question 3

42 # ---

43

44 def ajouteDansListe(lst, x):

45 if not estDansListe(lst, x):

46 lst[0] += 1

47 lst[lst[0]] = x

48

49 # Si la liste est pleine avant l'appel, cette proc´edure provoque une erreur

50

51 # La complexit´e de cette fonction est la mˆeme que celle de la fonction

52 # estDAnsListe i.e en O(m) o`u m est la taille de la liste

53

54 ############

55 #Partie II #

56 ############

57

(2)

58 # ---

59 # Question 4

60 # ---

61

62 plan1 = [ [5, 7],

63 [2, 2, 3, None, None],

64 [3, 1, 3, 5, None],

65 [4,1,2,4,5],

66 [2,3,5,None, None],

67 [3,2,3,4, None] ]

68

69 plan2 = [ [5, 4],

70 [1, 2, None, None, None],

71 [3, 1, 3, 4, None],

72 [1, 2, None, None, None],

73 [2, 2, 5, None, None],

74 [1, 4, None, None, None] ]

75

76 # ---

77 # Question 5

78 # ---

79

80 def creerPlanSansRoute(n):

81 lst = creerListeVide(n)

82 lst[0] = [n, 0]

83 for i in range(1, n+1):

84 lst[i] = creerListeVide(n-1)

85 return lst

86

87 # ---

88 # Question 6

89 # ---

90

91 def estVoisine(plan, x, y):

92 return estDansListe(plan[x], y)

93

94 # ---

95 # Question 7

96 # ---

97

98 def ajouteRoute(plan, x, y):

99 if not estVoisine(plan, x, y):

100 plan[0][1] += 1

101 ajouteDansListe(plan[x], y)

102 ajouteDansListe(plan[y], x)

103

104 # Il n'y a pas de risque de d´epassement de la capacit´e des listes

105 # puisqu'on n'ajoute pas de nouvelle ville

106

107 # ---

108 # Question 8

109 # ---

110

111 def afficheToutesLesRoutes(plan):

112 n, m = plan[0]

113 print('Ce plan contient', n, 'routes:')

114 for x in range(1, n+1):

115 for i in range(1, plan[x][0] + 1):

116 y = plan[x][i]

117 if x < y:

118 print(' (',x,'-',y,')', end=' ')

(3)

119 print('\n')

120

121 # Complexit´e: dans le parcours du plan, chacune des n villes est parcourue

122 # une fois et `a chaque fois la liste des villes voisines est parcourue. Comme

123 # il y a m routes `a deux sens le total des longueurs de ces listes est ´egal `a

124 # 2m soit au total une complexit´e en O(n+2m).

125

126 #############

127 #Partie III #

128 #############

129

130 # ---

131 # Question 9

132 # ---

133

134 def entierAleatoire(k):

135 return random.randint(1,k)

136

137 def coloriageAleatoire(plan, couleur, k, s, t):

138 for i in range(1, plan[0][0] + 1):

139 couleur[i] = entierAleatoire(k)

140 couleur[s] = 0

141 couleur[t] = k+1

142

143 # ---

144 # Question 10

145 # ---

146

147 def voisinesDeCouleur(plan, couleur, i, c):

148 lst = creerListeVide(plan[0][0])

149 for j in range(1, plan[i][0]+1):

150 y = plan[i][j]

151 if couleur[y] == c:

152 ajouteDansListe(lst, y)

153 return lst

154

155 # ---

156 # Question 11

157 # ---

158

159 # La version ci-dessous n'utilise pas la proc´edure pr´ec´edente

160

161 def voisinesDeLaListeDeCouleur(plan, couleur, liste, c):

162 lst = creerListeVide(plan[0][0])

163 for i in range(1, liste[0]+1):

164 x = liste[i]

165 for j in range(1, plan[x][0]+1):

166 y = plan[x][j]

167 if couleur[y] == c:

168 ajouteDansListe(lst, y)

169 return lst

170

171 # Complexit´e de cette version:

172 # Comme dans la question 8, les deux boucles sur i et j conduisent `a n+2m

173 # op´erations au maximum. Mais `a chaque fois on peut ˆetre amen´e `a ajouter un

174 # ´el´ement dans la liste lst, ce qui peut faire n op´erations.

175 # D'o`u une complexit´e totale en O(n(n+2m))=O(n(n+m)).

176

177 '''

178 # La version ci-dessous utilise la proc´edure pr´ec´edente

179 # mais est de complexit´e plus grande, car `a l'int´erieur de la

(4)

180 # boucle int´erieure il y a des parcours de listes en plus.

181

182 def voisinesDeLaListeDeCouleur(plan, couleur, liste, c):

183 lst = creerListeVide(plan[0][0])

184 for i in range(1, liste[0]+1):

185 lstVoisines = voisinesDeCouleur(plan, couleur, liste[i], c)

186 for j in range(1, lstVoisines[0]+1):

187 ajouteDansListe(lst, lstVoisines[j])

188 return lst

189 '''

190

191 # ---

192 # Question 12

193 # ---

194

195 def existeCheminArcEnCiel(plan, couleur, k, s, t):

196 liste = creerListeVide(plan[0][0])

197 ajouteDansListe(liste, s)

198 for c in range(1, k+2):

199 liste = voisinesDeLaListeDeCouleur(plan, couleur, liste, c)

200 if liste[0] == 0:

201 return False

202 return True

203

204 # La fonction voisinesDeLaListeDeCouleur est appel´ee k fois donc la

205 # complexit´e de la proc´edure pr´ec´edente est en O(kn(n+m)).

206

207 ############

208 #Partie IV #

209 ############

210

211 # ---

212 # Question 13

213 # ---

214

215 def existeCheminSimple(plan, k, s, t):

216 couleur = creerListeVide(plan[0][0])

217 for i in range(k**k):

218 coloriageAleatoire(plan, couleur, k, s, t)

219 if existeCheminArcEnCiel(plan, couleur, k, s, t):

220 return True

221 return False

222

223 # La cr´eation du tableau couleur est de complexit´e O(n) et celle de la focntion

224 # coloriageAleatoire aussi

225 # Mais la fonction existeCheminArcEnCiel qui est ex´ecut´ee k**k fois a une

226 # complexit´e en O(kn(n+m)) donc la fonction pr´ec´edente a une complexit´e en

227 # O(k**(k+1)n(n+m))

228

229 # ---

230 # Question 14

231 # ---

232

233 # Pour obtenir le d´etail d'un chemin qui convient, on modifie les proc´edures

234 # pr´ec´edentes de fac¸on `a stocker non seulement les villes, mais aussi le

235 # chemin suivi depuis le sommet de d´epart pour y parvenir. On remplacera donc

236 # chaque sommet x par la liste [x, chemin] o`u chemin est la liste des sommets entre

237 # le d´epart et x

238

239 def voisinesDeLaListeDeCouleur2(plan, couleur, liste, c):

240 lst = creerListeVide(plan[0][0])

(5)

241 for i in range(1, liste[0]+1):

242 x = liste[i][0]

243 for j in range(1, plan[x][0]+1):

244 y = plan[x][j]

245 if couleur[y] == c:

246 ajouteDansListe(lst, [y, liste[i][1]+[y]])

247 return lst

248

249 def existeCheminArcEnCiel2(plan, couleur, k, s, t):

250 liste = creerListeVide(plan[0][0])

251 ajouteDansListe(liste, [s, [s]])

252 for c in range(1, k+2):

253 liste = voisinesDeLaListeDeCouleur2(plan, couleur, liste, c)

254 if liste[0] == 0:

255 return False, []

256 return True, liste[1][1]

257

258 def existeCheminSimple2(plan, k, s, t):

259 couleur = creerListeVide(plan[0][0])

260 for i in range(k**k):

261 coloriageAleatoire(plan, couleur, k, s, t)

262 test, lst = existeCheminArcEnCiel2(plan, couleur, k, s, t)

263 if test:

264 return True, lst

265 return False, []

266

267 #############################################################

268 # TESTS

269

270 # Question 6:

271 print('Question 6:',estVoisine(plan1, 1, 3))

272 print('Question 6:',estVoisine(plan1, 1, 4),'\n')

273

274 # Question 8:

275 afficheToutesLesRoutes(plan1)

276

277 # Question 13:

278 s = 1 ; t = 3 ; k = 3

279 nbessais = 50000

280 nbreussi = 0

281 for i in range(nbessais):

282 if existeCheminSimple(plan1, k, s, t):

283 nbreussi += 1

284 proba = 1 - exp(k**k*log(1-k**(-k)))

285 print('Taux de succ`es dans existeCheminSimple:',nbreussi/nbessais, 'proba th´eorique=', '%.5f'%proba,

286

287 # Question 14:

288 s = 1 ; t = 3 ; k = 3

289 reussi = False

290 while not reussi: # s'il n'existe pas de chemin, boucle infinie! `a am´eliorer.

291 reussi, lst = existeCheminSimple2(plan1, k, s, t)

292 print('Chemin pour aller de',s,'`a',t,'en passant par',k,'villes:',lst) Question 6: True

Question 6: False

Ce plan contient 5 routes:

( 1 - 2 ) ( 1 - 3 ) ( 2 - 3 ) ( 2 - 5 ) ( 3 - 4 ) ( 3 - 5 ) ( 4 - 5 ) Taux de succ`es dans existeCheminSimple: 0.63662 proba th´eorique= 0.63904 Chemin pour aller de 1 `a 3 en passant par 3 villes: [1, 2, 5, 4, 3]

(6)

Références

Documents relatifs

C’est donc la hauteur issue de A dans le triangle ABC. Même raisonnement

Pour cette surface équivalente, le flux thermique va traverser le stratifié, l’aluminium et la laine de verre qui sont en série et donc les e ff ets vont s’ajouter pour engendrer

La fonction qui suit utilise deux listes : groupes qui contient les groupes en voie de formation et rep qui contient les repr´esentants des groupes d´ej` a rencontr´es.. Pour

qui renvoie une liste de N particules de rayon R , repr´ esent´ ees chacune par une liste ` a deux ´ el´ ements (position et vitesse, cf. figure 1), plac´ ees al´ eatoirement `

– sinon, on teste si item a un poids inf´erieur ` a celui de lst[pos] ; dans ce cas on l’ins`ere `a cet endroit ; puisque tous les ´el´ements entre 0 et pos-1 ont un poids

– La boucle qui commence ligne 3 devrait permettre de trouver le plus grand num´ero des images de la liste pr´ec´edente, mais ne fonctionne pas car la variable index max est remise

L’iodure de potassium et le diiode sont des solides : on les pèse à l’aide d’une balance de résolution 0,01 g puisque les masses sont indiquées au centième de gramme près dans

B est le spectre d’absorption de l’élément ayant A comme spectre d’émission ; ainsi, sur fond du spectre (coloré) de la lumière blanche, il présentera trois raies noires