Une solution O(log (M * N)) n'est pas possible pour cette tâche.
Examinons une tâche simplifiée : dans une matrice carrée "triée", supposez que tous les éléments situés au-dessus de la diagonale secondaire (vert) sont inférieurs à un nombre donné, que tous les éléments situés au-dessous de la diagonale secondaire (rouge) sont supérieurs à un nombre donné, et qu'il n'y a pas d'hypothèses supplémentaires pour les éléments situés sur la diagonale secondaire (jaune).
Ni les hypothèses initiales de cette tâche, ni ces hypothèses supplémentaires ne nous disent comment les éléments sur la diagonale secondaire sont liés les uns aux autres. Ce qui signifie que nous avons juste un tableau non trié de N entiers. Nous ne pouvons pas trouver un nombre donné dans le tableau non trié plus rapidement que O(N). Donc, pour le problème original (plus compliqué) avec une matrice carrée, nous ne pouvons pas obtenir une solution meilleure que O(N).
Pour une matrice rectangulaire, étirez l'image carrée et définissez les hypothèses supplémentaires en conséquence. Ici, nous avons min(N,M) sous-réseaux triés de taille max(N,M)/min(N,M) chacun. La meilleure façon de chercher ici est d'utiliser la recherche linéaire pour trouver un ou plusieurs sous-réseaux qui peuvent contenir une valeur donnée, puis d'utiliser la recherche binaire dans ces sous-réseaux. Dans le pire des cas, il est nécessaire d'effectuer une recherche binaire dans chaque sous-réseau. La complexité est O(min(N,M) * (1 + log(max(N,M) / min(N,M)))). Donc, pour le problème original (plus compliqué) avec une matrice rectangulaire, nous ne pouvons pas obtenir une solution meilleure que O(min(N,M) * ( 1 + log(max(N,M)) - log(min(N,M)))).
0 votes
Que savez-vous de la matrice à l'entrée, à part qu'elle est triée (comme la taille de ses lignes/colonnes, par exemple ?)
0 votes
@Yoel : Eh bien, il peut être énorme, seulement des entiers, peut avoir des nombres négatifs. Vous cherchez quelque chose de spécifique ?
0 votes
Est-il garanti que le premier élément de chaque rangée est plus grand que le dernier élément de la rangée précédente (comme dans votre exemple) ? Dans ce cas, le problème est trivial avec une recherche binaire modifiée.
0 votes
@BrokenGlass : Non, ce n'est pas du tout garanti. La seule condition est que les lignes soient triées par ordre croissant et les colonnes aussi.
0 votes
@phix23 : Je ne suis pas sûr de cela. Je n'y ai pas pensé en fait. Mais si
n = MxN
comment faire la recherche en considérant qu'il s'agit d'un tableau ?0 votes
Pourriez-vous préciser ce qu'est la propriété invariante des matrices ? Comment sont-elles "triées" ? Est-ce que A_(i)_(j) sera toujours non inférieure à A_(i-1)_(j) et A_(i)_(j-1) ? Y a-t-il d'autres conditions ?
0 votes
@Kaganar : J'ai édité la question pour vous.