নিকটতম দূরত্বের যোগফলটি সন্ধান করুন


10

এই কাজের জন্য আপনার কোডটি ইনপুট হিসাবে X এবং Y এর দুটি সাজানো অ্যারে নেওয়া উচিত। এটি এক্স এর প্রতিটি পূর্ণসংখ্যার এবং Y এর নিকটতম সংখ্যার মধ্যে পরম দূরত্বের যোগফল গণনা করা উচিত।

উদাহরণ:

X = (1 5,9)
Y = (3,4,7)

দূরত্ব 2 + 1 + 2।

X = (1,2,3)
Y = (0,8)

দূরত্ব 1 + 2 + 3।

আপনার কোডটি যে কোনও উপায়ে সুবিধাজনক input

মূল সীমাবদ্ধতাটি হ'ল দুটি কোডের দৈর্ঘ্যের যোগফলের সাথে আপনার কোডটি অবশ্যই রৈখিক সময়ে চলতে পারে। । (আপনি ধরে নিতে পারেন যে দুটি পূর্ণসংখ্যা যোগ করতে ধ্রুবক সময় লাগে))


আমরা অ্যারে পরিবর্তে তালিকা বা স্ট্রিম ব্যবহার করতে পারি?
অ্যাডহক গার্ফ হান্টার

@ গুগল উইজার্ড হ্যাঁ আপনি পারবেন!
আনুশ

1
কীভাবে এবং 1 + 2 + 3থেকে উদ্ভূত হয় ? X = (1,2,3)Y = (0,8)
অতিথি 271314

1
@ guest271314 নিকটতম দুই নম্বর প্রতিটি 1, 2এবং 3মধ্যে Yহয় 0। সুতরাং পার্থক্য আছে 1-0, 2-0, 3-0
dylnan

1
@ ফ্রিজফোনিক্স যেহেতু উভয় তালিকাগুলি বাছাই করা হয়েছে আপনি ও (এন + এম) এ এটি করতে পারেন, কারণ আপনি তালিকার উপরে পুনরাবৃত্তি করেছেন , প্রতিটি উপাদান একবার ঘুরে দেখছেন এবং যতক্ষণ আপনি এক্স আই এর নিকটতম ওয়াই জে উপাদানটির উপর নজর রাখছেন ততক্ষণ আপনি পারেন বিরুদ্ধে পরীক্ষা ওয়াই এবং ওয়াই + + 1 ঐ এক থেকে সবচেয়ে কাছে এক্স আমি + + 1এক্সওয়াইএক্সআমিওয়াইওয়াই+ +1এক্সআমি+ +1
: Giuseppe

উত্তর:


6

হাস্কেল , 70 64 বাইট

a%b=abs$a-b
x@(a:b)#y@(c:d)|e:_<-d,a%c>a%e=x#d|1>0=a%c+b#y
_#_=0

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

প্রথমে আমরা (%)সংখ্যার মধ্যে পরম পার্থক্য হিসাবে সংজ্ঞায়িত করি । তারপরে আমরা (#)আকর্ষণীয় ফাংশন হিসাবে সংজ্ঞায়িত করি । উভয় তালিকাগুলি খালি না থাকাকালীন প্রথম লাইনে আমরা মেলে:

x@(a:b)#(c:d:e)

এখান থেকে আমাদের প্রথম ক্ষেত্রে আমরা বাঁধে dকরার e:_সঙ্গে e:_<-d। এটি নিশ্চিত করে যে dখালি নয় এবং এটি প্রথম উপাদানটিতে সেট করে e

যদি দ্বিতীয় উপাদান ( ) প্রথম বারের চেয়ে কাছাকাছি (হয় ) প্রথম উপাদানে এক্স ( ), আমরা ফিরে প্রথম উপাদান সরানোর ওয়াই এবং একই সঙ্গে আবার কল এক্সওয়াইecএক্সax#dওয়াইএক্স

যদি আমরা প্যাটার্নটি মেলে তবে শর্তটি পাস না করি তবে:

a%c+b#y

যা, প্রথম আইটেম সরিয়ে ফেলা হবে এবং প্রথম উপাদান থেকে এটা পরম পার্থক্য যোগ এক্স অবশিষ্ট ফলাফলের জন্য।এক্সএক্স

শেষ পর্যন্ত আমরা যদি প্যাটার্নটির সাথে মেলে না তবে আমরা ফিরে আসি । প্যাটার্নটির সাথে মেলে না মানে X খালি থাকতে হবে কারণ Y খালি থাকতে পারে না।0এক্সওয়াই

এই অ্যালগরিদমের অর্ডার নোটেশন হে(|এক্স|+ +|ওয়াই|)

হাস্কেল , 34 বাইট

সময়ে আমি এটি কীভাবে করব তা এখানে :হে(|এক্স|×|ওয়াই|)

x#y=sum[minimum$abs.(z-)<$>y|z<-x]

এটি অনলাইন চেষ্টা করুন!


আমি প্রশ্নে স্পষ্ট করে দিয়েছিলাম যে আমরা ধরে নিতে পারি যে দুটি পূর্ণসংখ্যা যোগ করতে ধ্রুবক সময় লাগে।
আনুশ

2

পাইথন 2 , 124 120 বাইট

X,Y=input()
i=j=s=0
while i<len(X):
 v=abs(Y[j]-X[i])
 if j+1<len(Y)and v>=abs(Y[j+1]-X[i]):j+=1
 else:s+=v;i+=1
print s

এটি অনলাইন চেষ্টা করুন!

প্রোগ্রাম বনাম ফাংশনে গিয়ে 4 বাইট সংরক্ষণ করা হয়েছে।

উভয় তালিকাগুলি বাছাই করা হওয়ায় সময়-জটিলতার সীমাবদ্ধতা পূরণ সম্ভব। নোট করুন যে প্রতিটি সময় লুপের চারপাশে হয় iহয় বাড়ানো বা jবাড়ানো হয়। এইভাবে লুপটি বেশিরভাগ len(X)+len(Y)সময়ে কার্যকর করা হয় ।


আমি এই প্রশ্নে স্পষ্ট করে দিয়েছিলাম যে আমরা দুটি পূর্ণসংখ্যা যোগ করতে ধরে নিতে পারি ধ্রুব সময় লাগে।
আনুশ

1

সি (জিসিসি), 82 বাইট

n;f(x,y,a,b)int*x,*y;{for(n=0;a;)--b&&*x*2-*y>y[1]?++y:(++b,--a,n+=abs(*x++-*y));}

এটি দুটি পূর্ণসংখ্যার অ্যারে এবং তাদের দৈর্ঘ্য হিসাবে ইনপুট নেয় (যেহেতু অন্যথায় সি এর দৈর্ঘ্য পাওয়ার কোনও উপায় নেই)। এটি চালানোর জন্য দেখানো যেতে পারে O(a+b)কারণ লুপের প্রতিটি পুনরাবৃত্তির উপর হয় aবা bহ্রাস হয়, যা aপৌঁছলে শেষ হয় 0(এবং bনীচে হ্রাস করা যায় না 0)।

এটি অনলাইন চেষ্টা করুন!

n;                     // define sum as an integer
f(x,y,a,b)             // function taking two arrays and two lengths
int*x,*y;              // use k&r style definitions to shorten function declaration
{
 for(n=0;              // initialize sum to 0
 a;)                   // keep looping until x (the first array) runs out
                       // we'll decrement a/b every time we increment x/y respectively
 --b&&                 // if y has ≥1 elements left (b>1, but decrements in-place)...
 *x*2-*y>y[1]?         // ... and x - y > [next y] - x, but rearranged for brevity...
 ++y:                  // increment y (we already decremented b earlier);
 (++b,                 // otherwise, undo the in-place decrement of b from before...
 --a,n+=abs(*x++-*y))  // decrement a instead, add |x-y| to n, and then increment x
;}

কিছু নোট:

  • অ্যারেগুলিতে ইনডেক্সিংয়ের পরিবর্তে পয়েন্টারগুলিকে বাড়িয়ে তোলা এবং সরাসরি ডেরেফারেন্সিং এর মূল্য ( *xবনাম x[a]এবং y[1]বনাম y[b+1]) হওয়ার জন্য যথেষ্ট পরিমাণে বাইট সঞ্চয় করে ।

  • --b&&জন্য শর্ত চেক b>1একটি চৌমাথা ভাবে - যদি bহয় 1, এটা শুন্যতে মূল্যায়ন করবো। যেহেতু এটি সংশোধন করে b, আমাদের ত্রিনিয়ারের প্রথম শাখায় এটি পরিবর্তন করার দরকার নেই (যা অগ্রগতি হয় y), তবে আমাদের এটি দ্বিতীয়টিতে (যা অগ্রগতিতে x) ফিরে দরকার need

  • কোনও returnবিবৃতি দরকার নেই, কারণ কালো যাদু। (আমি মনে করি এটি কারণ কারণ মূল্যায়ন করা শেষ বিবৃতি সর্বদা n+=...অভিব্যক্তি হবে, যা প্রত্যাবর্তনের মানগুলির জন্য ব্যবহৃত রেজিস্টার হিসাবে ব্যবহার করে))


0

রুবি, 88 বাইট

->(p,q){a=q.each_cons(2).map{|a|a.sum/a.size}
x=a[0]
p.sum{|n|x=a.pop if n>x
(n-x).abs}}

এটি অনলাইন চেষ্টা করুন!

এছাড়াও, মজাদার জন্য, একটি স্বল্প বেনামে ফাংশন যা জটিলতার সীমাবদ্ধতাগুলি পুরোপুরি পূরণ করে না:

->(a,b){a.map{|x|x-b.min_by{|y|(x-y).abs}}.sum}

এই কোডটি কীভাবে কাজ করে আপনি সহজ শর্তে ব্যাখ্যা করতে পারেন? লিনিয়ার সময় এটি চালিত হয় কিনা তা আমি বলতে পারি না।
আনুশ

2
এটি প্রশ্নের প্রথম পরীক্ষার ক্ষেত্রে ব্যর্থ হয়, পাশাপাশি ইনপুটগুলিও [5, 6], [0, 1, 5]
ডুরকনব

0

জাভাস্ক্রিপ্ট (নোড.জেএস) , 80 বাইট

x=>g=(y,i=0,j=0,v=x[i],d=v-y[j],t=d>y[j+1]-v)=>1/v?g(y,i+!t,j+t)+!t*(d>0?d:-d):0
  • এটি ও (| এক্স | বার।
    • x, yরেফারেন্স দ্বারা পাস করা হয়, যা বিষয়বস্তু অনুলিপি করে না
  • 1/vx[i]অন্যথায় সত্যের বাইরে থাকলে মিথ্যা হয়
  • t-> d>y[j+1]-v-> v+v>y[j]+y[j+1]নিম্নলিখিত শর্তগুলি পূরণ করা যতক্ষণ মিথ্যা। আর যা উপায়ে y[j]নম্বর নিকটস্থ হয় vমধ্যেy
    • vএর চেয়ে কম (y[j]+y[j+1])/2, বা
    • y[j+1]পরিসীমা ছাড়িয়ে গেছে, যা রূপান্তর করবে NaNএবং NaNফলনের সাথে তুলনা করবেfalse
      • এজন্য আমরা >আরও 1 বাইট বাঁচাতে সাইনটি ফ্লিপ করতে পারি না
  • tসর্বদা একটি বুলিয়ান মান, এবং *এটি গণনা করার আগে 0/ এ রূপান্তর করে1

এটি অনলাইন চেষ্টা করুন!


0

গণিত, 40 বাইট

x = {1, 5, 9};
y = {3, 4, 7};

Norm[Flatten[Nearest[y] /@ x] - x]

আপনার অবশ্যই ইনপুট সহ একটি সম্পূর্ণ প্রোগ্রাম তৈরি করতে হবে:

f[x_,y_]:= Norm[Flatten[Nearest[y] /@ x] - x]

এখানে 1,000,000 পয়েন্টের (প্রতিটি 10,000 টি নমুনাযুক্ত) সময় দেওয়ার সময় এখানে রয়েছে y:

এখানে চিত্র বর্ণনা লিখুন

রৈখিক কাছাকাছি


1
আপনার ইনপুটটি পূর্ব-বিদ্যমান ভেরিয়েবল হিসাবে নেওয়া হওয়ায় এই উত্তরটি একটি কোড-স্নিপেট। আপনার এটি একটি উপ-রুটিন বা একটি সম্পূর্ণ প্রোগ্রাম হতে পুনরায় ফর্ম্যাট করা উচিত।
অ্যাডহক গার্ফ হান্টার

আমি লিনিয়ার সময়ে এটি কাজ করে যে কিছুটা সন্দেহজনক, এটি করা উচিত কেন আপনার কোন যুক্তি আছে? গাণিতিক তার বিল্টিনগুলির জটিলতায় বরং অস্বচ্ছ হতে থাকে।
অ্যাডহক গার্ফ হান্টার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.