Binary-ISH recherche à travers un ensemble partiellement commandé
-
29-09-2020 - |
Question
J'ai une fonction intéressante. Il faut des sous-ensembles de {1, ..., n} à des entiers positifs, c'est-à-dire
Si je savais que la commande était parfaitement lexicographique, j'utiliserais une simple recherche binaire. Je ne sais pas ça, et je crois que ce n'est pas (par exemple, $ f (\ {1,2,3,4,5,6 \}) $ est peut-être plus grand que $ f (\ {7 \}) $ ). Y a-t-il un bon algorithme O (n) pour faire cette recherche sur la posette? Évidemment, pour N de toute taille appréciable, je dois calculer F sur la volée et ne peut pas compter sur le stockage en mémoire.
Clarification après une discussion dans les commentaires: Le particulier $ F $ ITS GRANÇAIS IS est additif - spécifiquement, $ F (S)=SUM_ {K \ en s} g (k) + f (\ videtset) $ , avec $ g $ une fonction croissante monotone. Cela peut être plus facile que le cas général (qui est également intéressant, mais pas mon problème particulier).
La solution
Voici un algorithme simple qui fonctionne dans $ o (n ^ 2) $ temps et $ O (n) $ espace, en supposant que $ f (\ emptyset) $ , $ f (\ {1 \}) $ , $ f (\ {2 \ \ \}) $ , $ \ CDOT $ , $ f (\ {N \}) $ sont donnés dans un tableau.
L'idée de départ est environ le même que ce qui a été donné par l'OP dans son commentaire. "Nous rechercherons des sous-ensembles de la taille K à l'aide de l'ordre lexicographique, pour chaque $ k $ de $ 0 $ à $ N $ . Retenir l'une avec la meilleure valeur de $ f $ . "
Le problème est que comment rechercher la meilleure valeur de $ f $ sur des sous-ensembles de taille $ k $ , nommé $ b_K $ , dans O $ (N) $ temps. Au lieu de recherche binaire, nous allons vérifier si $ N $ N-1 $ , \ cdots, $ 1 $ devrait être inclus dans le meilleur sous-ensemble, un par un, en prenant l'avantage réel de l'ordre lexicographique sur des sous-ensembles.
- Initialize $ b_K= f (\ emptyset) $ . $ \ b_k $ sera la meilleure valeur sur les sous-ensembles de la taille $ k $ à la fin de cette procédure .
- initialiser $ comptez= 0. $ $ \ comptage $ est le nombre d'éléments que nous avons inclus dans le meilleur sous-ensemble jusqu'à présent.
- Vérifier $ f (\ {N \}) $ . Si $ B_K + F (\ {N \}) + F (\ {1, 2, \ CDOT, K-Nombre -1 \ \}) \ Le z $ , N $ N $ doit être inclus. Ajouter $ f (\ {n \}) $ to $ b_k $ et ajouter 1 à
$ Count $ . - check $ f (\ {n-1 \ \ \}) $ . Si $ B_K + F (\ {N-1 \}) + F (\ {1, 2, \ CDOTS, K-NOM-1 \ \ \}) \ LE Z $ , $ N-1 $ doit être inclure. Ajouter $ f (\ n-1 \ \}) $ to $ b_k $ et ajoutez 1 à < SPAN CLASSE="MATH-CONTENEUR"> $ COUPE $ $ .
- et ainsi de suite.
- jusqu'à ce que nous ayons vérifié $ f (\ {1 \}) $ ou $ comptent== K $ < / span>.
Nous pourrions nous demander si cela prendra $ o (n) $ pour calculer chaque $ f (\ {1 , 2, \ cdots, K-count-1 \}) $ , le calcul de chaque $ b_K $ seul aura $ f $ est additif, nous pouvons calculer toutes les sommes de préfixes de $ f (\ {1 \}) $ $ f (\ {2 \}) $ $ \ cdots $ , < span class="math-container"> $ f (\ {N \}) $ initial en $ O (N) $ temps. Ensuite, il faut $ O (1) $ pour accéder à chaque somme de préfixe.
depuis la recherche $ b_k $ prend $ o (n) $ temps, pour chaque $ K $ de $ 0 $ $ N $ , le temps total d'exécution est $ O (N ^ 2) $ .
La description ci-dessus de l'algorithme saute le cas le plus simple lorsque $ f (\ videtset) \ gt z $ . Dans ce cas, l'algorithme doit retourner qu'il n'y a pas de sous-ensemble.