CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[algo] éviter un stackoverflow

dark_drow
dark_drow
Niveau 15
23 novembre 2012 à 21:09:25

Bonsoir !
Je suis en train de me faire un mini projet de génération de (grandes) cartes aléatoire (avec des blocs d'eau/terre/foret...). Seulement, j'aimerai compter la taille de ces blocs pour éliminer les plus petits afin de lisser un peu ma carte.

Le problème c'est qu'à part avec un algo récursif je ne vois pas comment résoudre mon soucis, et c'est vraiment pas ma tasse de thé :hap:

le voici : http://pastebin.com/PUJfUL9F

90% des fois ou je le lance je me tape un stackoverfow, des idées pour m'aider ? (ne vous préoccupez pas d'un éventuel débordement de tableau, je l'ai pas inclus dans le bout de code pour la lisibilité)

merci d'avance !

godrik
godrik
Niveau 30
23 novembre 2012 à 21:25:57

La plupart des algos recursifs peuvent s'ecrire en utilisant une pile.

dark_drow
dark_drow
Niveau 15
23 novembre 2012 à 21:46:16

justement je bloque un peu la :x

hyrulink2
hyrulink2
Niveau 7
24 novembre 2012 à 11:42:43

Ton algo s'apparente a un parcours largeur de graphe où les noeuds sont les pixels. Pour dérecursiver un parcours largeur il faut utiliser une file. Dans ton cas le pseudo algo serai:

http://pastebin.com/P3KPFWue

pour la file tu peux utiliser std::queue:
http://en.cppreference.com/w/cpp/container/queue

hyrulink2
hyrulink2
Niveau 7
24 novembre 2012 à 11:59:05

Apres reflexion ton algo est en fait un parcours profondeur et il faudrait effectivement utiliser une pile comme dit godrik si l'ordre de parcours des cases est important. Mais ton ton cas il n'est pas important pour le résultat et l'algo que je t'ai donné devrait être plus efficace qu'avec une pile.

godrik
godrik
Niveau 30
24 novembre 2012 à 19:20:31

http://erik.deblan.org/blog/index.php?article6/quand-les-conteneurs-standards-deviennent-trop-lents

En passant

hyrulink2
hyrulink2
Niveau 7
24 novembre 2012 à 23:54:13

Ton article est bizarrement tourné, je veux dire c'est très vrai ce que tu dit mais tu as l'air de critiquer std::stack alors que c'est plus std::deque que tu remet en cause en vrai. std::stack n'est qu'un adapteur auquel le conteneur par défaut est std::deque, rien ne t'empêche de lui fournir ton conteneur optimisé pour tes besoins comme un std::vector avec un allocateur custom ou une version modifiée de std::array qui a les methodes qui vont bien.

godrik
godrik
Niveau 30
25 novembre 2012 à 01:56:31

Hyrulink, c'est certainement vrai, mais l'ecriture de la documentation de la stl ne permet pas vraiment de savoir comment changer le conteneur sous jacent. Je sais que c'est possible, mais la documentation de tout les conteneurs et adapteurs template dans la stl et dans boost est tellement merdique que je ne connais pas beaucoup de gens qui savent comment faire le changement.

En pratique std::stack c'est std::deque. Les gens ne savent pas changer le conteneurs. De plus, le probleme principale est l'incredulite devant la perte de performances. Beaucoup de gens n'y croit pas.

hyrulink2
hyrulink2
Niveau 7
25 novembre 2012 à 11:29:40

std::stack<int, std::vector<int>>, c'est pas trop compliqué quand même. Par contre pour changer l'allocateur de std::vector je suis d'accord c'est plus triky.
Le "problème" de std::deque en fait c'est que que la mémoire n'y est pas totalement contiguë comme dans un vector pour éviter de tout réallouer en cas de dépassement de capacité et pour avoir un pop_front efficace. Du coup ça demande des opérations en plus pour maintenir la structure, d'où la différence avec un vector. Là où deque est vraiment utile par contre c'est pour std::queue, j'ai pas fait de benchmark mais je doute que std::list y soit plus efficace.

dark_drow
dark_drow
Niveau 15
25 novembre 2012 à 15:35:02

héhé merci hyrulink2 pour l'algo, j'avais même pas envisagé le problème comme ça :)

Sinon j'ai eu l'idée saugrenue de faire ça en Java, juste parce que je suis tombé amoureux de l'API (super lisible, plein de sample... j'ai souvent moyen de m'en sortir avec ça) donc je testerai avec la classe Stack classique ^^'

godrik
godrik
Niveau 30
25 novembre 2012 à 18:33:17

(desole a OP pour le hors sujet complet)

hyrulink2, dans le cas de l'utilisation d'une stack, la memoire est parfaitement contigue parceque toutes les insertion et deletion se font du meme cote. Du fai, en memoire, tu as la meme chose que tu utilises un std::deque ou un std::vector. J'ai fait le test sur mon laptop. En utilisant std::deque, sur mon laptop ca prends 2.015s, alors que std::vector prends 1.910s. L'implementation simple de Pile prends 1.493s alors que PileSafe prends 1.118s.

Je n'ai pas pu tester avec std::array car l'interface de programmation n'est pas compatible : il manque push_back et pop_back. Certainement, on peut hacker std::array pour obtenir une interface de programmation suffisante. Mais il n'y a dans ce cas pas de difference avec ce que j'avais ecrit.

Je maintiens mes conclusions: la stl est chiante a utiliser des que l'on veut sortir des clous a cause d'une documentation merdique. Et en pratique dans plein de cas d'utilisation ca perds une partie des performances. La STL c'est pas magique: comme toutes les abstractions, ca a un cout.

hyrulink2
hyrulink2
Niveau 7
25 novembre 2012 à 21:32:53

Un deque c'est implanté pour faire en sorte qu'il n'y ait pas de reallocations et que les itérateurs et références restent valide après insertion et suppression aux extremités. En général c'est implanté avec une succession de petits tableaux. Comment veut-tu dans ce cas que la mémoire soit contigue?

Compile ce code:
std::deque<int> d;
std::vector<int> v;
for (int i = 0; i < 10000; ++i)
{
d.push_back(i);
v.push_back(i);
}
std::cout << &d.back() - &d.front() << std::endl <<
&v.back() - &v.front() << std::endl;

Tu auras du gros n'importe quoi sur la première ligne et 9999 sur la seconde.

Sinon comme j'ai dit je suis d'accord pour le reste, je voulais juste pointer le fait que stack n'est qu'un adapteur indépendant de son type sous-jacent.

godrik
godrik
Niveau 30
25 novembre 2012 à 21:38:25

ah, c'est implementer comme ca ?

Je pensais que c'etait implementer comme un tableau circuliare au sein d'un vector.

hyrulink2
hyrulink2
Niveau 7
25 novembre 2012 à 22:05:13

J'ai pas regardé l'implem de mon compilo, les sources de la stl c'est très imbuvable. Mais c'est ce qui semble le plus probable vu les specs de std::deque. Avec une mémoire contiguë il serait impossible de garantir la validité des références après insertion aux extremités. D'ailleurs c'est plus ou moins ce que dit cppreference:
http://en.cppreference.com/w/cpp/container/deque
"typical implementations use a sequence of individually allocated fixed-size arrays"

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Programmation
  • Création de sites web
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment