J'ai une grille MxN 2D (ou matrice). Les cellules de la matrice peuvent contenir un nombre entier. Une cellule avec un entier différent de zéro est dite remplie. L'ensemble des cellules peuplées dans la matrice est appelé "configuration". Je veux créer un algorithme de codage ou de hachage qui me permettra d'identifier de manière unique une configuration dans la matrice, en calculant sa valeur codée (qui devrait générer un nombre unique). Je préfère coder au hachage, car les collisions seront totalement indésirables. Est-ce que quelqu'un peut suggérer un algorithme de codage que je peux utiliser pour calculer un "id" unique pour une configuration donnée?Modèles de codage dans un espace 2D (matrice)
Répondre
Donc c'est un tableau de 1 et 0? Que diriez-vous d'une compression RLE ou LZW de ce tableau?
Il convient de noter que ces algorithmes peuvent produire un ensemble de données plus grand que la matrice elle-même - à peine un "ID". –
Pour une représentation qui permet une comparaison exacte, il n'est pas possible de faire mieux qu'une compression optimale d'une séquence de bits qui représentent la configuration.
Si vous souhaitez que les valeurs booléennes MxN soient codées de manière unique dans un entier, vous avez besoin de 2 valeurs M * N. Que ce soit faisable en utilisant les entiers de précision fixe de votre plateforme dépend de la taille de M et N; Sinon, vous devrez utiliser une chaîne de caractères ou un grand nombre entier. Comme les données d'origine ont une valeur entière plutôt que 1 ou 0, un ID de chaîne binaire naïf d'une matrice naïve donnera une compression de 8 * sizeof (matrix::cell_type)
. Une chaîne de bits optimisée pour des valeurs éparses pourrait être meilleure. De bonnes implémentations de chaînes de bits fragmentées compressent les données, ce qui réduit l'espace de stockage de la représentation et permet une comparaison exacte rapide, qui sont les exigences.
Si les motifs sont garantis à un certain niveau, il y a des optimisations que vous pouvez faire en compressant l'information, mais vous devez donner plus d'informations. Par exemple, utilisez-vous une représentation matricielle fragmentée (en bandes, en diagonale, en ligne compressée, etc.) et avez accès aux composants internes de la matrice matricielle, puis mappez-la naturellement à une chaîne de bits compressée.
En regardant votre autre poste, il semble que la matrice est utilisée comme la grille d'un jeu plutôt que comme une matrice. Dans ce cas, il est probablement préférable d'utiliser une compression sur la chaîne de bits, car cela donne une autre propriété utile - la représentation codée de la chaîne binaire des matrices dont les configurations sont des translations ne différera que par la première valeur du codage.
Ce n'est pas un algorithme - il s'agit simplement de transférer la matrice entière dans un autre type de données. –
Je ne pensais pas qu'il valait la peine d'écrire l'algorithme pour tester chaque entrée dans la matrice et définir le bit correspondant dans une chaîne de bits. Cela vaut la peine d'utiliser la compression sur cette chaîne de bits si vous en savez plus sur les données que ce qui est donné. –
Ça ne vaut pas la peine d'écrire. Je comprends ce que tu voulais dire. Ce que je dis, c'est que votre méthode consiste simplement à transférer la matrice dans une autre forme - dans ce cas, une chaîne de bits. –
On ne sait pas exactement ce que vous voulez réaliser, mais peut-être qu'un personnalisébloom filter pourrait être adapté à votre problème.
En fonction de ce problème que vous essayez de résoudre, le follwoing vient à l'esprit:
- utiliser une recherche-table pour associer des matrices ids largeur
- stocker uniquement les valeurs des champs peuplés; leur position dans la matrice peut être codée soit d'une valeur individuelle par champ ou à l'aide d'une image bitmap pour l'ensemble de matrice
Je suggère d'utiliser un algorithme de hachage qui aura une chance 99,999999999% de la génération d'un identifiant unique.Dans la plupart des scénarios, il est acceptable d'avoir une collision chaque milliardième hash. Ma suggestion est d'utiliser l'algorithme CRC, car il génère un ensemble de hachages hautement distribué et a un taux relativement faible de collisions.
Peu importe s'il y a une collision ou non. Même s'il y a une collision, vous pouvez continuer à vérifier la matrice int par int pour voir si elle est similaire.
Tant que les collisions se produisent très rarement les frais généraux est 0
donc une fonction de hachage pourrait être tout aussi simple que d'ajouter tous les int ensemble de. Si cela est suffisant, cela dépend des valeurs possibles des entiers et de leur nombre (si donc dans la matrice entière seulement 1 ou 2 cellules ont une valeur, ce hachage ne fonctionnera pas)
- 1. Problème avec la matrice 2D de JButton
- 2. Comment faire pour convertir une matrice 1-D en une matrice 2D
- 3. Matrice de Python Matlab
- 4. j2me - Faire pivoter la matrice de points 2D par incréments de 45 degrés
- 5. Arrays 2D dans Objective C
- 6. lecture dans un ascii « labyrinthe » dans un tableau 2d
- 7. Algorithmes de codage et de décodage de codes QR (codes à barres 2D)?
- 8. Normes de codage et modèles de conception dans la bibliothèque PHPSpec
- 9. Comment avoir un lien dans un espace réservé ouvrir un ModalPopup dans un espace réservé différent?
- 10. 2d erreur de tableau C++
- 11. Que signifie matrice * vector contrairement à vector * matrice
- 12. Comment puis-je construire une matrice 2D à partir d'une entrée standard en Perl?
- 13. Matrice adressable symétriquement
- 14. Triangle 2D dans SlimDX
- 15. Convertir une matrice décimale en une matrice binaire dans SciPy
- 16. Problèmes de codage dans PyQt
- 17. Problème de codage dans Vimdiff?
- 18. matrice de boutons
- 19. Report Matrice de remplissage
- 20. Comment stocker un tableau 2d dans un hachage en Perl?
- 21. Définir un symbole dans un autre espace de noms
- 22. comment sélectionner un élément dans un espace de noms spécifique?
- 23. Comment ajouter un espace dans un élément de schéma XML?
- 24. convertir une matrice de listes à une matrice
- 25. itération sélective de la matrice dans php
- 26. Est-ce que 'using namespace' est dans un autre espace de noms équivalent à un alias?
- 27. Mettre des chaînes dans un chararray 2D dans C
- 28. transposition de la matrice dans XSLT
- 29. Matrice statique ou matrice allouée dynamique
- 30. physique 2d Platformer
Cela ressemble à votre question précédente: http://stackoverflow.com/questions/1530546/how-can-i-code-this-problem-c –
Quelle est la taille de MxN? Utilisez-vous une représentation matricielle clairsemée ou non? –