7
votes

Moyen le plus rapide de trouver si INT gray contient un nombre

C'est une question étrange. J'ai un tableau entier en Java, où chaque Int représente une couleur. Ils seront soit 0xFFFFFFFF OU 0x0. Quel serait le moyen le plus rapide de trouver si ce tableau contient des valeurs égales à 0xFFFFFFFF?

Ceci est mon code actuel: P>

int length = w * h;
for (int i = 0; i < length; i++) {
    if (pixels[i] == 0xFFFFFFFF) {
        return true;
    }
}


2 commentaires

Par curiosité, y a-t-il une raison pour laquelle vous stockez les pixels dans un bitmap lorsqu'il y a de bien meilleurs formats? Pourriez-vous faire une étape de prétraitement en convertissant chaque bitmap en une structure de données plus efficace? Il semble que le coût unique du prétraitement puisse vous faire économiser une énorme quantité de temps et d'espace plus tard dans le programme.


C'est en fait png. J'utilise simplement la classe Bitmap intégrée d'Android. S'il y a une meilleure façon, j'aimerais savoir, mais je ne suis pas sûr de ce que je pouvais faire d'autre.


9 Réponses :


2
votes

Peu importe le niveau de Bytecode, mais au niveau du code natif,

if (pixels[i] != 0)


0 commentaires

13
votes

Non, il n'y a pas de solution plus rapide à moins que le tableau d'entiers est déjà trié, ce que je doute donnait que c'est un tableau de couleurs.

Pour analyser via un tableau non formé prend du temps linéaire "O (n)". C'est ce que vous faites et que vous sortez de la méthode dès qu'une correspondance est trouvée qui est bonne aussi.


1 commentaires

C'est ce que je pensais, il ne me fait jamais mal de trouver de nouvelles connaissances si possible, cependant. Merci!



11
votes

Sans passer à une autre structure de données, non, il n'y a pas de meilleure façon de trouver si le tableau contient cette valeur. Vous devez regarder tous les éléments du tableau pour voir si elle est là, car si vous ne cochez pas un endroit particulier que vous pourriez manquer une copie de cette couleur de pixel.

Cela dit, il existe d'autres moyens que vous pouvez résoudre ce problème. Voici quelques réflexions sur la façon d'accélérer ce:


0 commentaires

-1
votes

Utilisation de l'intégré pour Forach est un TAD plus rapidement que l'indexé pour l'ID en tant qu'IM élimine une vérification liée

for(int pix:pixels){
    if(pix!=0)
        return true;
}


1 commentaires

Ceci est effectivement beaucoup plus lent, car il enregistre automatiquement chaque valeur PIX. Le pour chacun n'élimine pas non plus la vérification des limites.



1
votes

Si votre tableau est vraiment grand, cela pourrait valoir la peine de se diviser et de conquérir. Autrement dit, attribuez des segments des données à plusieurs threads (probablement t threads où t est le nombre de cœurs de processeur disponibles). Avec un ensemble de données suffisamment volumineux, le parallélisme peut amortir le coût de démarrage du fil.


0 commentaires

0
votes

Le seul potentiel d'amélioration de la performance est la comparaison. Je pense que l'opérateur bitwise serait un peu plus rapide que l'opérateur conditionnel.
Vous pouvez faire ce xxx


1 commentaires

Bien que cette approche soit raisonnable en C, je ne pense pas que ce code compilait en Java. Javac ne permet pas une conversion implicite de int sur booléen . Dans les deux cas, le résultat de l'expression de la clause de test de la déclaration IF est comparé à la constante statique zéro. La seule différence est que, dans C (qui manque de type Boolean type), cette comparaison n'a pas besoin d'être explicite.



0
votes

Vous ne pouvez pas vérifier lorsque vous insérez la couleur dans la matrice? Si tel est le cas, vous pouvez stocker l'index de l'élément de la matrice qui contient la couleur 0xFFFFFFFFF. Puisque vous voulez "toute" entrée qui a une telle valeur, cela devrait faire le tour: D

Sinon, votre réponse a la complexité de O (n) qui est la meilleure possible, car le tableau n'est pas (et ne peut pas être, comme vous le dites) commandé.


0 commentaires

1
votes

Voici l'optimisation simple qui aide sur de grandes matrices: placez la valeur demandée à la fin de la matrice et éliminez ainsi la vérification des limites de la matrice. (Templatetypedef a déjà mentionné cette optimisation.) Cette solution enregistre 25% de temps de fonctionnement de la boucle et il est bon pour les grandes tableaux:

tmp = a[n - 1]
a[n - 1] = 0xFFFFFFFF

pos = 0
while a[pos] != 0xFFFFFFFF
    pos = pos + 1

a[n - 1] = tmp

if a[pos] = 0xFFFFFFFF then
    return pos
return -1


0 commentaires

-1
votes
Arrays.asList(...).contains(...)

0 commentaires