সর্বাধিক কুড়াল + বি সন্ধান করুন


14

আপনাকে ( ক, খ ) এবং একটি এক্সের তালিকা দেওয়া হবে । প্রতিটি এক্সের জন্য সর্বাধিক অক্ষ + বি গণনা করুন । আপনি ধরে নিতে পারেন একটি , বি এবং এক্স অ-নেতিবাচক পূর্ণসংখ্যা।

তোমার প্রোগ্রাম বা ফাংশন (যদৃচ্ছতা যদি আপনার কোড যে, ইনপুট না জড়িত থাকে) প্রত্যাশিত চালানোর আবশ্যক হে ( লগ ইন করুন এন ) সময় যেখানে এন মোট ইনপুট দৈর্ঘ্য (সমষ্টি বা উভয় তালিকার লেন্থ সর্বোচ্চ) হয়।

এটি কোড-গল্ফ। সংক্ষিপ্ততম কোড জিতেছে।

উদাহরণ

[[2 8] [4 0] [2 1] [1 10] [3 3] [0 4]] [1 2 3 4 5]

আউটপুট:

[11 12 14 16 20]

ব্যাখ্যা:

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

জটিলতা সম্পর্কে নোট:

যদি আপনি একটি বিল্টিন ব্যবহার করেন যাতে ভাল গড় কেস জটিলতা থাকে এবং তাত্ত্বিকভাবে সহজেই প্রত্যাশিত জটিলতা পেতে এটি এলোমেলো করা যায় তবে আপনি নিজের ভাষা ধরেই নিতে পারেন।

এর অর্থ, যদি আপনার প্রোগ্রামটি ও ( এন লগ এন ) এ পরীক্ষিত হতে পারে , সম্ভবত আপনার ভাষা প্রয়োগের কারণে প্রান্তের ক্ষেত্রে ব্যতিক্রম রয়েছে, তবে আপনার নিজস্ব কোডে যৌক্তিকভাবে এটি দেখা যায় না, তবে আমরা বলব যে এটি ও ( n লগ এন )।


এটি আমার কাছে প্রত্যাশিত ফলাফল হওয়া উচিত বলে মনে হচ্ছে [11 12 12 15 4]। ???
বব জার্ভিস - মনিকা

@ BobJarvis এটি সংশ্লিষ্ট x এর জন্য সর্বোচ্চ + বর্গ, তবে তালিকার জন্য সমস্ত (ক, খ)। উদাহরণটিকে কম বিভ্রান্তিকর করতে পরিবর্তিত হয়েছে।
জিমি 23013

মোট ইনপুট দৈর্ঘ্য = এক্স এর অ্যারের দৈর্ঘ্য (ক, খ) জোড়া?
অপ্টিমাইজার

@ অপ্টিমাইজার রাইট
জিমি 23013

কেন এটি পরিষ্কার যে এটি এমনকি সম্ভব O(n log(n))? আপনি একটি রেফারেন্স অ্যালগরিদম সরবরাহ করতে পারেন?
flawr

উত্তর:


1

পাইথ - 99 98 বাইট

এটি @ কিথরান্ডাল এর পাইথন উত্তরের প্রত্যক্ষ অনুবাদ। এটি অবশ্যই আরও অনেক গল্ফ করা যেতে পারে। আমি শীঘ্রই একটি ব্যাখ্যা পোস্ট করা হবে

K[_1Z;FNShQAkdNW&>K2>+*k@K_3d+*@K_2@K_3eK=K<K_3)~K[c-eKd-k@K_2kd;FNSeQW&>K2>N@K2=K>K3)aY+*hKN@K1;Y

স্টাডিনের মাধ্যমে কমা দ্বারা পৃথকীকৃত দুটি কমা বিস্মৃত তালিকা নেয়।

এখানে চেষ্টা করুন

K                  K=
 [  )              A List containing
  _1               Negative 1
  Z                Zero
FN                 For N in
 ShQ               Sorted first input
Akd                Double assign k and d
 N                 To N
 W                 While
  &                Logical And
   >K2             K>2
   >               Greater Than
    +*k@K_3d       K[-3]*k+d
    +              Plus
     *@K_2@K_3     K[-2]*K[-3]
     eK            K[-1]
  =K               K=
   <K_3            K[:-3]
  )                Close while loop
 ~K                K+=
  [      )         List constructor
   c               Float division
    -              Minus
     eK            K[-1]
     d             d
    -              Minus
     k             k
     @K_2          K[-2]
   k               k
   d               d
 ;                 End list and for loop
FN                 For N in
  SeQ              Sorted second input
  W                While loop
   &               Logical and
    >K2            K[2:]
    >              Greater than
     N             N
     @K2           K[2]
   =K              K=
   >K3             K[3:]
  )                Close while loop
  aY               Y.append - Y is empty list
   +               Plus
    *hKN           (K+1)*N
    @K1            K[1]
;                  Close out everything
Y                  Print Y

10

পাইথন, 214 বাইট

S=sorted
def M(L,X):
 H=[-1,0];R={}
 for a,b in S(L):
    while H[2:]and a*H[-3]+b>H[-2]*H[-3]+H[-1]:H=H[:-3]
    H+=[1.*(H[-1]-b)/(a-H[-2]),a,b]
 for x in S(X):
    while H[2:]and x>H[2]:H=H[3:]
    R[x]=H[0]*x+H[1]
 return R

a,bক্রমবর্ধমান aক্রমে ইনপুটটির মাধ্যমে পুনরাবৃত্তি করে উত্তল হালকে গণনা করে । উত্তল হাল যেখানে Hবিন্যাসটি ব্যবহার করে রেকর্ড করা হয়-1,0,x1,a1,b1,x2,a2,b2,x2,...,xn,an,bnxi এক্স ছেদ তুল্য হয় a{i-1},b{i-1}এবং ai,bi

তারপরে আমি পুনরাবৃত্তি করি যদিও ইনপুটটি xসাজানো ক্রমে রয়েছে, উত্তরণ হোলটি কেটে দিয়ে আমার যেতে যেতে চালিত করে।

O (n lgn) প্রকারের বাদে সবকিছুই লিনিয়ার।

এটি চালান:

>>> print M([[2,8],[4,0],[2,1],[1,10],[3,3],[0,4]], [1,2,3,4,5])
{1: 11, 2: 12, 3: 14, 4: 16, 5: 20}

@ ব্যবহারকারী23013: স্থির
কিথ র্যান্ডাল

@ কিথরান্ডল শেষ ধাপে আপনি Hপ্রতিটিটির জন্য রৈখিকভাবে অনুসন্ধান xকরেন X, তাই না ?. যখন উভয় তালিকার সমান দৈর্ঘ্য হবে তখন কী আমাদের ও (এন ^ 2) জটিলতা সম্ভব নয় ?
coredump

1
@ কর্ডাম্প: আমি Hপ্রত্যেকের জন্য রৈখিকভাবে অনুসন্ধান করি x, তবে আমি xসর্বশেষ অনুসন্ধানটি কোথায় থামিয়েছিলাম তা মনে করি এবং সেখানে পরবর্তী অনুসন্ধান শুরু করি। সুতরাং অভ্যন্তরীণ whileলুপটি সর্বাধিক O (n) বারে xকার্যকর করতে পারে (যদিও এটি কোনও ব্যক্তির জন্য O (n) বার কার্যকর করতে পারে x)।
কিথ র্যান্ডাল

@ কর্ডাম্প: নোট করুন যে whileপ্রথম forলুপের অভ্যন্তরীণ লুপের জন্য একই জিনিস ঘটে ।
কিথ র্যান্ডাল

@ কিথরান্ডাল আমি এটি মিস করেছি, ধন্যবাদ। চতুর!
coredump

6

হাস্কেল, 204 271 বাইট

সম্পাদনা : উত্তল হালকে তালিকার তালিকা হিসাবে আপডেট করে (তবে উংগল্ফড সংস্করণের মতো একই জটিলতার সাথে), "স্প্লিটলুকআপ এক্স" এর পরিবর্তে "স্প্লিট (x + 1)" ব্যবহার করে এবং প্রিডুলের মতো সমস্ত যোগ্য ফাংশন কলগুলি সরিয়ে আরও বেশি গল্ফ করেছে। foldl।

এটি একটি ফাংশন তৈরি করে যা (ক, খ) যুগলের তালিকা এবং এক্স মান একটি তালিকা প্রত্যাশা করে। আমার ধারণা এপিএল পরিবারে একই ধারণা ব্যবহার করে এটি দৈর্ঘ্য অনুসারে উড়িয়ে দেওয়া হবে, তবে এখানে এটি রয়েছে:

import Data.Map
r=fromListWith max
[]%v=[(0,v)]
i@((p,u):j)%v|p>v#u=j%v|0<1=(v#u,v):i
(a,b)#(c,d)=1+div(b-d)(c-a)
o i x=(\(a,b)->a*x+b)$snd$findMax$fst$split(x+1)$r$foldl'(%)[]$r$zip(fmap fst i)i
f=fmap.o

নমুনা ব্যবহার:

[1 of 1] Compiling Main             ( linear-min.hs, interpreted )
Ok, modules loaded: Main.
λ> f [(2,8), (4,0), (2,1), (1,10), (3,3), (0,4)] [1..5]
[11,12,14,16,20]
λ> f [(1,20), (2,12), (3,11), (4,8)] [1..5]
[21,22,23,24,28]

এটি ও (এন লগ এন) সময়ে কাজ করে; বিশ্লেষণের জন্য নীচে দেখুন।

সম্পাদনা করুন: এখানে বিগ-ও বিশ্লেষণ এবং এটি কীভাবে সমস্তরূপে কাজ করে তার বিবরণ সহ একটি অদম্য সংস্করণ রয়েছে:

import Prelude hiding (null, empty)
import Data.Map hiding (map, foldl)

-- Just for clarity:
type X = Int
type Y = Int
type Line = (Int,Int)
type Hull = Data.Map.Map X Line
slope (a,b) = a

{-- Take a list of pairs (a,b) representing lines a*x + b and sort by
    ascending slope, dropping any lines which are parallel to but below
    another line.

    This composition is O(n log n); n for traversing the input and
    the output, log n per item for dictionary inserts during construction.
    The input and output are both lists of length <= n.
--}
sort :: [Line] -> [Line]
sort = toList . fromListWith max

{-- For lines ax+b, a'x+b' with a < a', find the first value of x
    at which a'x + b' exceeds ax + b. --}
breakEven :: Line -> Line -> X
breakEven p@(a,b) q@(a',b') = if slope p < slope q
                                 then 1 + ((b - b') `div` (a' - a))
                                 else error "unexpected ordering"

{-- Update the convex hull with a line whose slope is greater
    than any other lines in the hull.  Drop line segments
    from the hull until the new line intersects the final segment.
    split is used to find the portion of the convex hull
    to the right of some x value; it has complexity O(log n).
    insert is also O(log n), so one invocation of this 
    function has an O(log n) cost.

    updateHull is recursive, but see analysis for hull to
    account for all updateHull calls during one execution.
--}
updateHull :: Line -> Hull -> Hull
updateHull line hull
    | null hull = singleton 0 line
    | slope line <= slope lastLine = error "Hull must be updated with lines of increasing slope"
    | hull == hull' = insert x line hull
    | otherwise = updateHull line hull''
    where (lastBkpt, lastLine) = findMax hull
          x = breakEven lastLine line
          hull' = fst $ x `split` hull
          hull'' = fst $ lastBkpt `split` hull

{-- Build the convex hull by adding lines one at a time,
    ordered by increasing slope.

    Each call to updateHull has an immediate cost of O(log n),
    and either adds or removes a segment from the hull. No
    segment is added more than once, so the total cost is
    O(n log n).
--}
hull :: [Line] -> Hull
hull = foldl (flip updateHull) empty . sort

{-- Find the highest line for the given x value by looking up the nearest
    (breakpoint, line) pair with breakpoint <= x.  This uses the neat
    function splitLookup which looks up a key k in a dictionary and returns
    a triple of:
        - The subdictionary with keys < k.
        - Just v if (k -> v) is in the dictionary, or Nothing otherwise
        - The subdictionary with keys > k.

    O(log n) for dictionary lookup.
--}
valueOn :: Hull -> X -> Y
valueOn boundary x = a*x + b
    where (a,b) = case splitLookup x boundary of
                    (_  , Just ab, _) -> ab
                    (lhs,       _, _) -> snd $ findMax lhs


{-- Solve the problem!

    O(n log n) since it maps an O(log n) function over a list of size O(n).
    Computation of the function to map is also O(n log n) due to the use
    of hull.
--}
solve :: [Line] -> [X] -> [Y]
solve lines = map (valueOn $ hull lines)

-- Test case from the original problem
test = [(2,8), (4,0), (2,1), (1,10), (3,3), (0,4)] :: [Line]
verify = solve test [1..5] == [11,12,14,16,20]

-- Test case from comment
test' = [(1,20),(2,12),(3,11),(4,8)] :: [Line]
verify' = solve test' [1..5] == [21,22,23,24,28]

2

কমন লিস্প - 648 692

একটি আসল বাইনারি অনুসন্ধান সহ।

(use-package :optima)(defun z(l e)(labels((i(n m)(/(-(cadr m)(cadr n))(-(car n)(car m))))(m(l)(match l((list* a b c r)(if(<(i a b)(i b c))(list* a(m(list* b c r)))(m(list* a c r))))(_ l)))(f(x &aux(x(cdr x)))`(+(*,(car x)x),(cadr x)))(g(s e)(let*((q(- e s))(h(+ s(floor q 2)))d)(if(> q 1)(let((v(g s h))(d(pop l)))`(if(< x,(car d)),v,(g(1+ h)e)))(cond((not(car (setq d (pop l))))(f d))((> q 0)`(if(< x,(car d)),(f d),(f(pop l))))(t(f d)))))))(setq l(loop for(a b)on(m(remove-duplicates(#3=stable-sort(#3# l'< :key'cadr)'< :key'car):key 'car)) by #'cdr collect`(,(when b(i a b)),(car a),(cadr a))))`(mapcar(eval(lambda(x),(g 0(1-(length l)))))',e)))

(z '((2 8) (4 0) (2 1) (1 10) (3 3) (0 4)) '(1 2 3 4 5))
=> (11 12 14 16 20)

ব্যাখ্যা

যাক এন (ক, খ) দৈর্ঘ্য হতে হবে এবং k পয়েন্ট দৈর্ঘ্য।

  • সাজান (ক, খ) দ্বারা a, তারপরে খ - ও (এন.এলএন (এন))
  • সদৃশ a(সমান্তরাল লাইন) জন্য এন্ট্রি সরিয়ে , সর্বাধিকের সাথে কেবল প্যারালাল লাইন ধরে রাখা b, যা সর্বদা অন্যের চেয়ে বেশি থাকে (ছেদগুলি গণনা করার সময় আমরা শূন্য দ্বারা বিভাগগুলি রোধ করি) - ও (এন)
  • ফলাফলকে সংকুচিত করুন - ও (এন) : যখন আমাদের বাছাই তালিকায় স্যাভুটিভ এলিমেন্টস (a0, b0) (a1, b1) (a2, b2) থাকে, যেমন (a0, b0) এবং (a1, b1) এর ছেদ বিন্দু ) আরও বড় ) এক (A1, B1 এবং (A2, B2), তারপর (A1, B1) নিরাপদে উপেক্ষিত করা যেতে পারে।
  • (xab) উপাদানের একটি তালিকা তৈরি করুন, যেখানে x হল মান আপ-টু-লাইন অক্ষটি + বি x এর জন্য সর্বাধিক (এই তালিকাটি পূর্ববর্তী পদক্ষেপগুলির জন্য x ধন্যবাদ দ্বারা সাজানো হয়েছে ) - ও (এন)
  • সেই তালিকাটি প্রদত্ত, একটি ল্যাম্বডা তৈরি করুন যা এর ইনপুটটির জন্য একটি অন্তরাল পরীক্ষা করে এবং সর্বাধিক মান গণনা করে - বাইনারি গাছটি ও (এন) এ নির্মিত ( /programming//a/4309901/124319 দেখুন )। বাইনারি অনুসন্ধান প্রয়োগ করা হবে যা ও (এলএন (এন)) জটিলতা রয়েছে। উদাহরণ ইনপুট সহ, আমরা নিম্নলিখিত ফাংশনটি তৈরি করি (সেই ফাংশনটি তখন সংকলিত হয়):

    (LAMBDA (X)
      (IF (< X 4)
          (IF (< X 2)
              (IF (< X -6)
                  (+ (* 0 X) 4)
                  (+ (* 1 X) 10))
              (+ (* 2 X) 8))
          (+ (* 4 X) 0)))
    
  • সমস্ত উপাদানগুলির জন্য সেই ফাংশনটি প্রয়োগ করুন - O (k.ln (n))

জটিলতার ফলাফল: ও ((এন + কে) (এলএন এন)) সবচেয়ে খারাপ পরিস্থিতিতে।

মোট ইনপুট (এন + কে) এর জন্য আমরা জটিলতার অনুমান দিতে পারি না, কারণ কে এবং এন স্বতন্ত্র। উদাহরণস্বরূপ, এন যদি asympototically অবহেলাযোগ্য আর্ট কে হয় , তবে মোট জটিলতা হবে O (কে)

তবে আমরা যদি ধরে নিই যে কে = ও (এন) হয় , তবে ফলাফলের জটিলতা হ'ল ও (এন.এলএন (এন))

অন্যান্য উদাহরণ

(z '((1 10) (1 8) (1 7)) '(1 2 3 4 5))
=> (11 12 13 14 15)

এবং আমরা কী গণনা করা হচ্ছে তা দেখার জন্য যদি ব্যাককোটগুলি স্থানান্তরিত করি তবে আমরা দেখতে পাচ্ছি যে আমাদের কোনও তুলনা করার প্রয়োজনও নেই (একবার প্রথম তালিকাটি পূর্বনির্ধারিত হয়ে গেলে):

(MAPCAR (LAMBDA (X) (+ (* 1 X) 10)) '(1 2 3 4 5))

এখানে আরও একটি উদাহরণ দেওয়া হয়েছে (একটি মন্তব্য থেকে নেওয়া):

(z '((1 20) (2 12) (3 11) (4 8)) '(1 2 3 4 5))
=> (21 22 23 24 28)

কার্যকর কার্য:

(MAPCAR
  (LAMBDA (X)
    (IF (< X 4)
        (+ (* 1 X) 20)
        (+ (* 4 X) 8)))
  '(1 2 3 4 5))

হে (n log n + K) অবশ্যই হয় মধ্যে হে ((ঢ + K) লগ (ঢ + K))।
jimmy23013

আপনি কোন দোভাষী ব্যবহার করছেন? আইডিয়ন দেয় (LIST* A B C R) should be a lambda expression
jimmy23013

@ user23013 দুঃখিত, আমি ভুলে গেছি (use-package :optima) (সম্পাদনা ...)
coredump

@ ব্যবহারকারী23013 আমি ভীতাম আমি আইডিয়োনকে একটি বাহ্যিক লাইব্রেরি লোড করতে পারি না। পরীক্ষার জন্য, দয়া করে এসবিসিএল ডাউনলোড করুন (বা অন্য কোনও, যদিও আমি কেবল এসবিসিএলে পরীক্ষা করেছি) এবং কুইললিপ ইনস্টল করুন । তারপরে, আপনি ডাউনলোড করতে এবং ইনস্টল করতে (কিউএল: কুইকলোড: অপটিমা) করতে পারেন optima। অবশেষে, আমি যে কোডটি দিয়েছি তা মূল্যায়নযোগ্য হওয়া উচিত।
coredump

এটি উত্তরে (MAPCAR (EVAL (LAMBDA (X) ...যা মূল্যায়ন করে returned আপনি কি এখানে কিছু ডিবাগ কোড রেখে গেছেন?
জিমি 23013
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.