উল্লম্ব দৃশ্যমানতার সমস্যার জন্য দক্ষ অ্যালগরিদম


18

একটি সমস্যা নিয়ে চিন্তা করার সময়, আমি বুঝতে পেরেছিলাম যে আমাকে নিম্নলিখিত কার্যটি সমাধান করার জন্য একটি দক্ষ অ্যালগরিদম তৈরি করতে হবে:

সমস্যা: আমাদের পাশ এর একটি দ্বি-মাত্রিক বর্গক্ষেত্র বাক্স দেওয়া হবে nযার পক্ষের অক্ষগুলির সাথে সমান্তরাল l আমরা উপরের মাধ্যমে এটি দেখতে পারেন। যাইহোক, m অনুভূমিক অংশগুলিও রয়েছে। প্রতিটি বিভাগে একটি পূর্ণসংখ্যা y কর্ডিনেট ( 0yn ) এবং x -ordordates ( 0x1<x2n ) রয়েছে এবং পয়েন্টগুলি (x1,y) এবং (x2,y) (দেখুন নীচে ছবি)।

আমরা জানতে চাইব, বাক্সের শীর্ষে প্রতিটি ইউনিট বিভাগের জন্য, আমরা যদি এই বিভাগটি দেখি তবে বাক্সের অভ্যন্তরে আমরা কতটা গভীরভাবে দেখতে পারি।

আনুষ্ঠানিকভাবে জন্য x{0,,n1}maxi: [x,x+1][x1,i,x2,i]yi

উদাহরণ: প্রদত্ত এবং বিভাগগুলি নীচের চিত্রের মতো অবস্থিত, ফলাফল (5, 5, 5, 3, 8, 3, 7, 8, 7) । কীভাবে গভীর আলো বাক্সে যেতে পারে তা দেখুন।মি = 7 ( 5 , 5 , 5 , 3 , 8 , 3 , 7 , 8 , 7 )n=9m=7(5,5,5,3,8,3,7,8,7)

সাতটি বিভাগ;  ছায়াযুক্ত অংশটি সেই অঞ্চলকে নির্দেশ করে যা আলোর মাধ্যমে পৌঁছানো যায়

সৌভাগ্যবশত আমাদের জন্য, উভয় n এবং m হয় বেশ ছোট এবং আমরা বন্ধ-লাইন কম্পিউটেশন করতে পারেন।

এই সমস্যার সমাধান করার সবচেয়ে সহজ অ্যালগরিদম হ'ল ব্রুটি ফোর্স: প্রতিটি বিভাগের জন্য পুরো অ্যারেটি অতিক্রম করে এবং যেখানে প্রয়োজন সেখানে আপডেট করুন। তবে এটি আমাদের খুব চিত্তাকর্ষক দেয় না ।O(mn)

একটি দুর্দান্ত উন্নতি হ'ল একটি সেগমেন্ট ট্রি ব্যবহার করা যা ক্যোয়ারির সময় বিভাগে মূল্য সর্বাধিক করতে সক্ষম হয় এবং চূড়ান্ত মানগুলি পড়তে পারে। আমি এটি আর বর্ণনা করব না, তবে আমরা দেখতে পাচ্ছি যে সময়ের জটিলতা হ'ল ।O((m+n)logn)

তবে আমি একটি দ্রুত অ্যালগরিদম নিয়ে এসেছি:

রূপরেখা:

  1. কর্ডিনেটের ক্রমহ্রাসমান ক্রমগুলিতে বিভাগগুলিকে বাছাই করুন (গণনার সাজানোর প্রকরণের সাথে লিনিয়ার সময়)। এখন নোট করুন যে কোনওx এরyx ইউনাইট অংশটি আগে কোনও বিভাগ দ্বারা আচ্ছাদিত হয়ে থাকে তবে নিম্নলিখিত কোনও বিভাগটি এই ইউনাইট বিভাগের মধ্য দিয়ে যাওয়া আলোর রশ্মিকে আবদ্ধ করতে পারে না। তারপরে আমরা উপরের থেকে বাক্সের নীচে একটি লাইন সুইপ করব।x

  2. এখন আসুন কিছু সংজ্ঞা পরিচয় করিয়ে: -unit সেগমেন্ট মিষ্টির যার উপর একটি কাল্পনিক অনুভূমিক সেগমেন্ট হয় এক্স -coordinates পূর্ণসংখ্যা যার দৈর্ঘ্য 1. সুদূরপ্রসারী প্রক্রিয়া চলাকালীন প্রতিটি সেগমেন্ট পারেন হতে পারে অচিহ্নিত (যে, একটি হালকা মরীচি থেকে যাচ্ছে বাক্সের শীর্ষস্থানটি এই বিভাগে পৌঁছতে পারে) বা চিহ্নিত (বিপরীত ক্ষেত্রে)। X 1 = n , x 2 = n + 1 সহ সর্বদা চিহ্নবিহীন একটি এক্স- ইউনিট বিভাগ বিবেচনা করুন । এস সেটগুলি এস 0 = { 0 } প্রবর্তন করা যাকxxxx1=nx2=n+1নিম্নলিখিতচিহ্নবিহীনবিভাগেরসাথে x -unit বিভাগের (যদি থাকে তবে)থাকবে। । প্রতিটি সেটে একটানাচিহ্নিতচিহ্নের পুরো ক্রম থাকবেS0={0},S1={1},,Sn={n} x

  3. আমাদের এমন একটি ডেটা স্ট্রাকচার দরকার যা এই বিভাগগুলিতে পরিচালনা করতে সক্ষম হয় এবং দক্ষতার সাথে সেট করে। আমরা সর্বাধিক হোল্ড ফিল্ড দ্বারা প্রসারিত একটি সন্ধান ইউনিয়ন কাঠামো ব্যবহার করব -unit সেগমেন্ট ইনডেক্স (সূচকঅচিহ্নিতসেগমেন্ট)।x

  4. এখন আমরা বিভাগগুলি দক্ষতার সাথে পরিচালনা করতে পারি। ধরা যাক আমরা এখন -th বিভাগটিকে ক্রমানুসারে বিবেচনা করছি (এটি "ক্যোয়ারী" বলুন), যা x 1 থেকে শুরু হয়ে x 2 এ শেষ হবে । আমরা সব বের করতে হবে অচিহ্নিত এক্স -unit অংশ যা ভিতরে অন্তর্ভুক্ত করা হয় আমি -th সেগমেন্ট (এই ঠিক অংশ যার উপর হালকা মরীচি তার পথ শেষ হয়ে যাবে আছে)। আমরা নিম্নলিখিতটি করবো: প্রথমত, আমরা কোয়েরির ভিতরে প্রথম চিহ্নবিহীন বিভাগটি পাই ( x 1 রয়েছে এমন সেটটির প্রতিনিধি খুঁজুন এবং এই সেটটির সর্বাধিক সূচীটি পাবেন, যা সংজ্ঞা অনুসারে চিহ্ন চিহ্নযুক্ত অংশ )। তারপরে এই সূচকটিix1x2 xix1 ক্যোয়ারির অভ্যন্তরে রয়েছে, এটিকে ফলাফলের সাথে যুক্ত করুন (এই বিভাগের ফলাফল y হয় ) এবংএই সূচিটিচিহ্নিত করুন ( x এবং x + 1 সমেতইউনিয়নসেট)। তারপর এই পদ্ধতি পুনরাবৃত্তি যতক্ষণ না আমরা সব অনুসন্ধানঅচিহ্নিতঅংশ হলো, আগামীখুঁজুনক্যোয়ারী আমাদের সূচক দেয় এক্স এক্স 2xyxx+1xx2

নোট করুন যে প্রতিটি ফাইন্ড -ইউনিয়ন অপারেশন কেবল দুটি ক্ষেত্রে করা হবে: হয় আমরা একটি বিভাগ বিবেচনা করা শুরু করি (যা টাইম হতে পারে ) অথবা আমরা সবেমাত্র একটি এক্স- ইউনিট বিভাগ চিহ্নিত করেছি (এটি এন বার হতে পারে )। সুতরাং সামগ্রিক জটিলতার হয় হে ( ( এন + + মি ) α ( এন ) ) ( α হয় একটি Ackermann ফাংশন বিপরীত )। যদি কিছু পরিষ্কার না হয় তবে আমি এ সম্পর্কে আরও বিস্তারিত বলতে পারি। আমার কিছুটা সময় থাকলে আমি কিছু ছবি যুক্ত করতে সক্ষম হব।mxnO((n+m)α(n))α

এখন আমি "প্রাচীর" পৌঁছেছি। আমি লিনিয়ার অ্যালগরিদম নিয়ে আসতে পারি না, যদিও মনে হয় এটি একটি হওয়া উচিত। সুতরাং, আমার দুটি প্রশ্ন রয়েছে:

  • লিনিয়ার-টাইম অ্যালগরিদম আছে (যা, ) অনুভূমিক অংশটি দৃশ্যমানতার সমস্যাটি সমাধান করছে?O(n+m)
  • যদি না হয়, প্রমাণ দৃশ্যমানতা সমস্যা কি ω(n+m) ?

আপনি আপনার এম বিভাগগুলি কত দ্রুত সাজান ?
বাবু

@ বাবু, প্রশ্ন গণনা বাছাই সুনির্দিষ্ট করে, যা প্রশ্ন হিসাবে বলা হয়েছে, রৈখিক সময়ে চলে ("গণনার সাজানোর প্রকরণের সাথে রৈখিক সময়")।
ডিডাব্লিউ

আপনি কি বাম থেকে ডানে ঝাপটানোর চেষ্টা করেছেন? আপনার যা দরকার তা উপর বাছাই করা হয় এবং এক্স 2 উভয় হে ( মি ) এবং হে ( মি ) ডানদিকে হেঁটে যাওয়ার ধাপ। সুতরাং মোট ( মি )x1x2O(m)O(m)O(m)
अवैध_আইডি

হ্যাঁ, আমি চেষ্টা করেছি যাইহোক, এই ক্ষেত্রে মিষ্টির লাইন উপযুক্তভাবে প্রতিক্রিয়া অবশ্যই সেগমেন্ট শুরুতে পূরণ করে যখন (অন্য কথায়, সেগমেন্ট এর সমান নম্বর যোগ multiset করার -coordinate), সেগমেন্ট শেষে পূরণ করে (একজন occurence অপসারণ Y -কোর্ডিনেট) এবং সর্বোচ্চ সক্রিয় সেগমেন্ট আউটপুট (মাল্টিসেটে সর্বাধিক মান আউটপুট)। কোনও ধরণের ডেটা স্ট্রাকচারের কথা আমরা শুনতে পেলাম না (ধর্মান্তরিত) ধ্রুব সময়ে। yy
mnbvmar

@ এমএনবিভিমার হতে পারে একটি বোবা পরামর্শ, তবে আকারের অ্যারে সম্পর্কে কীভাবে আপনি ঝাঁকুনি দিয়ে প্রতি ঘরের ( এন ) বন্ধ করে দিন । এভ্রি সেল এর জন্য আপনি সর্বাধিক y জানেন এবং আপনি ম্যাট্রিক্সে এটি প্রবেশ করতে পারেন, এছাড়াও আপনি ভেরিয়েবলের সাথে সামগ্রিক সর্বাধিকের ট্র্যাক রাখতে পারেন। nO(n)y
अवैध_আইডি

উত্তর:


1
  1. প্রথমে দুটি পৃথক অ্যারে A এবং B তে লাইনগুলির এবং x 2 উভয় স্থানাঙ্ক সাজান । ( এম )x1x2ABO(m)
  2. আমরা একটি auxilary বিট অ্যারে আকার বজায় রাখা সক্রিয় অংশ ট্র্যাক রাখতে।n
  3. বাম থেকে ডানে ঝাড়ফুঁক করা শুরু করুন:
  4. জন্য (i=0,i<n,i++)
  5. {
  6. ..if সঙ্গে Y মান হে ( 1 )x1=iyc O(1)
  7. .. {
  8. .... সন্ধান করুন ( )max
  9. .... স্টোর ( ) ( 1 )maxO(1)
  10. ..}
  11. ..if সঙ্গে Y মান হে ( 1 )x2=iyc O(1)
  12. .. {
  13. .... সন্ধান করুন ( max )
  14. .... স্টোর ( ) ( 1 )maxO(1)
  15. ..}
  16. }

এন বিট সহ বিট অ্যারে ব্যবহার করে ( সর্বাধিক ) প্রয়োগ করা যেতে পারে । এখন যখনই আমরা সরাতে অথবা একটি উপাদান যোগ এল আমরা যথাক্রমে সত্য বা মিথ্যা একটি বিট সেট করে এই পূর্ণসংখ্যা আপডেট করতে পারেন। এখন আপনার ব্যবহৃত প্রোগ্রামিং ভাষার উপর নির্ভর করে দুটি বিকল্প রয়েছে এবং অনুমান n অপেক্ষাকৃত ছোট অর্থাৎ l o n g l o n g i n t এর চেয়ে ছোট যা কমপক্ষে 64৪ বিট বা এই সংখ্যার একটি নির্দিষ্ট পরিমাণের:maxnLnlonglongint

  • ধ্রুবক সময়ে সর্বনিম্ন উল্লেখযোগ্য বিট পান কিছু হার্ডওয়্যার এবং জিসিসি দ্বারা সমর্থিত।
  • কে পূর্ণসংখ্যক ( 1 ) এ রূপান্তর করার মাধ্যমে আপনি সর্বাধিক (সরাসরি নয় তবে আপনি এটি পেতে পারেন) পাবেন।LO(1)

আমি জানি এই বেশ একটি হ্যাক কারণ এটির জন্য একটি সর্বোচ্চ মান অনুমান তাই এন একটি ধ্রুবক যেমন তারপর দেখা যাবে ...nn


আমি দেখতে পাচ্ছি, ধরে নিলাম আপনি 64-বিট x86 প্রসেসর পেয়েছেন, আপনি কেবলমাত্র পরিচালনা করতে পারবেন । কি হবে যদি এন লক্ষ লক্ষ অনুক্রম হল? n64n
mnbvmar

তারপরে আপনার আরও পূর্ণসংখ্যার প্রয়োজন হবে। দুটি পূর্ণসংখ্যার আপনি সব ব্যবস্থা করতে সক্ষম আপ 128, ইত্যাদি সুতরাং হে ( মি ) সর্বাধিক গবেষনার পদক্ষেপ পূর্ণসংখ্যার সংখ্যা গোপন নেই প্রয়োজনীয়, যা আপনি হয়তো এখনো অপ্টিমাইজ যদি মি ছোট। আপনি আপনার প্রশ্নে উল্লেখ করেছেন যে এন তুলনামূলকভাবে ছোট, তাই আমি অনুমান করেছি যে এটি কয়েক মিলিয়ন ক্রমে নয়। যাইহোক দীর্ঘ দীর্ঘ অন্তর্গত একটি 32-বিট প্রসেসরের এমনকি সংজ্ঞা দ্বারা সর্বদা কমপক্ষে 64৪ বিট থাকে। nO(m)mn
अवैध_আইডি

অবশ্যই এটি সত্য, সি ++ স্ট্যান্ডার্ড long long intকমপক্ষে 64৪-বিট পূর্ণসংখ্যার ধরণ হিসাবে সংজ্ঞায়িত করে । তবে, এটি কী হবে না যদি বিশাল হয় এবং আমরা শব্দের আকারকে ডাব্লু (সাধারণত ডাব্লু = 64 ) হিসাবে চিহ্নিত করি , তবে প্রত্যেকটি ( এন ) নেবেnww=64findসময়? তারপরে আমরা মোট(এমএন)দিয়ে শেষ করবO(nw)O(mnw)
mnbvmar

nncwncO(n+m)n100O(n2) তুলনায়O(nlogn).
invalid_id

3
I am confused by your choice of formatting. You know you can typeset code here, right?
Raphael

0

I don't have a linear algorithm, but this one seems to be O(m log m).

Sort the segments based on the first coordinate and height. This means that (x1, l1) always comes before (x2, l2) whenever x1 < x2. Also, (x1, l1) at height y1 comes before (x1, l2) at height y2 whenever y1 > y2.

একই প্রথম স্থানাঙ্কযুক্ত প্রতিটি উপসেটের জন্য, আমরা নিম্নলিখিতটি করি। প্রথম বিভাগটি (x1, এল) হতে দিন। সাবসেটের অন্যান্য সমস্ত বিভাগের জন্য: বিভাগটি যদি প্রথমটির চেয়ে দীর্ঘ হয় তবে এটি (x1, xt) থেকে পরিবর্তন করে (এল, xt) করুন এবং সঠিক ক্রমে এটি এল-উপসেটে যুক্ত করুন। অন্যথায় এটি ফেলে দিন। অবশেষে, যদি পরবর্তী সাবসেটটির প্রথম এলের তুলনায় কম স্থানাঙ্ক থাকে, তবে (x1, L) (x1, x2) এবং (x2, L) বিভক্ত করুন। সঠিক ক্রমে পরবর্তী সাবসেটটিতে (x2, L) যুক্ত করুন। আমরা এটি করতে পারি কারণ সাবসেটের প্রথম বিভাগটি বেশি এবং এটি (x1, এল) এর পরিসীমাটি কভার করে। এই নতুন বিভাগটি (এল, এক্স 2) কভার করে এমন একটি হতে পারে তবে আমরা এটি জানতে পারব না যতক্ষণ না আমরা সাবসেটটি না দেখি যা প্রথমে এল এর সমন্বয় সাধন করে।

আমরা সমস্ত সাবসেটের মাধ্যমে চলার পরে, আমাদের এমন একটি বিভাগ থাকবে যা ওভারল্যাপ করে না। প্রদত্ত এক্স এর জন্য ওয়াই মানটি কী তা নির্ধারণ করতে, আমাদের কেবলমাত্র অবশিষ্ট অংশগুলি দিয়ে চালানো উচিত।

সুতরাং এখানে জটিলতাটি কী: সাজানটি হ'ল ও (এম লগ এম)। সাবসেটগুলির মাধ্যমে লুপিং হ'ল ও (এম)। একটি লুকও ও (এম)।

সুতরাং মনে হচ্ছে এই অ্যালগরিদম n এর থেকে পৃথক।

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