Vous obtenez une liste de ( a, b ) et une liste de x . Calculez la hache maximale + b pour chaque x . Vous pouvez supposer que a , b et x sont des entiers non négatifs.
Votre programme ou fonction doit s'exécuter dans le temps prévu (au hasard si votre code implique cela, pas l'entrée) O ( n log n ) temps où n est la longueur totale d'entrée (somme ou maximum des longueurs des deux listes).
C'est du code-golf. Le code le plus court gagne.
Exemple
[[2 8] [4 0] [2 1] [1 10] [3 3] [0 4]] [1 2 3 4 5]
Production:
[11 12 14 16 20]
Explication:
11 = 1*1 + 10
12 = 1*2 + 10 = 2*2 + 8
14 = 2*3 + 8
16 = 2*4 + 8 = 4*4 + 0
20 = 4*5 + 0
Remarque sur la complexité:
Si vous avez utilisé un module intégré ayant une bonne complexité de cas moyen, et qu'il peut être randomisé pour obtenir facilement la complexité attendue en théorie, vous pouvez supposer que votre langage l'a fait.
Cela signifie que si votre programme peut être testé pour être en O ( n log n ), peut-être avec des exceptions de cas limites en raison de l'implémentation de votre langage, mais ne peut pas être vu logiquement dans votre propre code, nous dirons que c'est O ( n log n ).
la source
O(n log(n))
? Pouvez-vous fournir un algorithme de référence?Réponses:
Pyth -
9998 octetsCeci est à peu près une traduction directe de la réponse Python de @ KeithRandall. Il peut certainement être joué beaucoup plus.
Je posterai bientôt une explication.Prend deux listes séparées par des virgules, séparées par des virgules via stdin.
Essayez-le ici
la source
Python, 214 octets
Calcule la coque convexe en itérant à travers l'entrée
a,b
ena
ordre croissant . La coque convexe est enregistrée enH
utilisant le format-1,0,x1,a1,b1,x2,a2,b2,x2,...,xn,an,bn
oùxi
est la coordonnée x de l'intersection dea{i-1},b{i-1}
etai,bi
.Ensuite, je répète si l'entrée
x
en ordre trié, tronquant la coque convexe pour suivre le rythme.Tout est linéaire sauf les sortes qui sont O (n lgn).
Exécutez-le comme:
la source
H
linéaire pour chaquex
dansX
, ne vous ?. N'est-il pas possible que nous ayons une complexité O (n ^ 2) lorsque les deux listes ont la même longueur?H
linéairement pour chacunx
, mais parce que je fais lesx
s pour me rappeler où la dernière recherche s'est arrêtée et commencer la recherche suivante là-bas. Ainsi, lawhile
boucle interne peut s'exécuter au plus O (n) fois sur l'ensemblex
(même si elle peut exécuter O (n) fois pour n'importe quel individux
).while
boucle interne dans la premièrefor
boucle.Haskell, 204
271octetsEdit : a joué beaucoup plus loin en mettant à jour la coque convexe sous forme de liste (mais avec la même complexité que la version non golfée), en utilisant "split (x + 1)" au lieu de "splitLookup x", et en supprimant tous les appels de fonction qualifiés comme Predule. foldl.
Cela crée une fonction f qui attend la liste des paires (a, b) et une liste de valeurs x. Je suppose que tout dans la famille APL sera emporté par la longueur en utilisant les mêmes idées, mais voici:
Exemple d'utilisation:
Il fonctionne en temps O (n log n); voir ci-dessous pour l'analyse.
Edit: Voici une version non golfée avec l'analyse big-O et une description de la façon dont tout cela fonctionne:
la source
Lisp commun - 648
692Avec une recherche binaire réelle.
Explication
Soit n la longueur de (a, b) et k la longueur des points.
a
(lignes parallèles), en ne conservant que la ligne parallèle avec le maximumb
, qui est toujours supérieur à l'autre (on évite les divisions par zéro lors du calcul des intersections) - O (n)étant donné cette liste, créez un lambda qui effectue une vérification d'intervalle pour son entrée et calcule la valeur maximale - l'arborescence binaire est construite en O (n) (voir /programming//a/4309901/124319 ). La recherche binaire qui sera appliquée a une complexité O (ln (n)) . Avec l'exemple d'entrée, nous construisons la fonction suivante (cette fonction est ensuite compilée):
appliquer cette fonction pour tous les éléments - O (k.ln (n))
Complexité résultante: O ((n + k) (ln n))) dans le pire des cas.
Nous ne pouvons pas fournir d'estimation de complexité pour le nombre total d'entrées (n + k), car k et n sont indépendants. Par exemple, si n est asymptotiquement négligeable par rapport à k , alors la complexité totale serait O (k) .
Mais si nous supposons que k = O (n) , alors la complexité résultante est O (n.ln (n)) .
Autres exemples
Et si nous déplaçons les guillemets arrière pour voir ce qui est calculé, nous pouvons voir que nous n'avons même pas besoin de faire de comparaison (une fois que la première liste est prétraitée):
Voici un autre exemple (tiré d'un commentaire):
La fonction efficace:
la source
(LIST* A B C R) should be a lambda expression
.(use-package :optima)
(modifier ...)optima
. Enfin, le code que j'ai fourni devrait être évaluable.(MAPCAR (EVAL (LAMBDA (X) ...
qui évalue la réponse. Avez-vous laissé un code de débogage là-bas?