Question

J'ai une fonction intéressante. Il faut des sous-ensembles de {1, ..., n} à des entiers positifs, c'est-à-dire $ f: p ([[[[\) \ rightarrow z ^ + $ . Je sais que si S est un sous-ensemble de s ', $ f (s) . De plus, si S et S 'ont la même cardinalité, la commande induite par F est lexicographique, donc par exemple $ f (\ {1,2,4 \}) . Compte tenu d'une valeur z , j'aimerais trouver s telle que $ f (s) <= z $ et $ f (s) <= f (t) <= z $ implique $ f (t) $ - c'est-à-dire que je veux faire une recherche sur le réseau des sous-ensembles de [N].

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).

Était-ce utile?

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.

  1. 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 .
  2. initialiser $ comptez= 0. $ $ \ comptage $ est le nombre d'éléments que nous avons inclus dans le meilleur sous-ensemble jusqu'à présent.
  3. 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 $ .
  4. 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 $ $ .
  5. et ainsi de suite.
  6. jusqu'à ce que nous ayons vérifié $ f (\ {1 \}) $ ou $ comptent== K $ < / span>.
  7. 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à cs.stackexchange
scroll top