যত দ্রুত সম্ভব পাঁচটি ছোট ছোট পূর্ণসংখ্যার দুটি সন্ধান করা


9

আমি একটি ছোট এম্বেড থাকা সিস্টেমে চিত্রের ডেটাতে একটি 5-ক্রস মিডিয়ান ফিল্টারটির একটি প্রকরণ ব্যবহার করি

    x
  x x x
    x

অ্যালগরিদমটি সত্যই সহজ: 5 স্বাক্ষরযুক্ত পূর্ণসংখ্যা মানগুলি পড়ুন, সর্বোচ্চ 2 পান, সেগুলি সম্পর্কে কিছু গণনা করুন এবং স্বাক্ষরবিহীন পূর্ণসংখ্যার ফলাফলটি আবার লিখুন।

কী সুন্দর তা হ'ল 5 পূর্ণসংখ্যার ইনপুট মানগুলি 0-10-এর মধ্যে থাকে। গণনা করা পূর্ণসংখ্যার মানটি 0-2-এর মধ্যেও রয়েছে!

প্রোফাইলিংয়ের মাধ্যমে, আমি বুঝতে পেরেছি যে সবচেয়ে বড় দুটি নম্বর পাওয়া বাধা হ'ল তাই আমি এই অংশটি দ্রুত করতে চাই। এই নির্বাচনটি সম্পাদন করার দ্রুততম উপায় কী?

বর্তমান অ্যালগরিদম 5 নম্বর এবং এইচডাব্লু-সমর্থিত সিএলজেড ফাংশন দ্বারা প্রদত্ত অবস্থানে 1 সহ 32 বিট মাস্ক ব্যবহার করে।
আমার বলা উচিত যে সিপিইউ একটি স্বত্বাধিকারী, আমার সংস্থার বাইরে উপলভ্য নয়। আমার সংকলকটি জিসিসি তবে এই সিপিইউয়ের জন্য তৈরি টেইলার।

আমি যদি দেখার জন্য সারণিটি ব্যবহার করতে পারি তবে এটি সনাক্ত করার চেষ্টা করেছি তবে আমি ব্যবহার করতে পারি এমন কী তৈরি করতে আমি ব্যর্থ হয়েছি।

আমার কাছে ইনপুটটির জন্য সংমিশ্রণ রয়েছে তবে অর্ডারটি গুরুত্বপূর্ণ নয়, যেমনটি একই ।215[5,0,0,0,5][5,5,0,0,0]

এটি ঘটে যে নীচের হ্যাশ-ফাংশনটি সংঘর্ষ ছাড়াই একটি নিখুঁত হ্যাশ তৈরি করে!

def hash(x):
    h = 0
    for i in x:
        h = 33*h+i
    return h

তবে হ্যাশটি বিশাল এবং এটি ব্যবহারের জন্য যথেষ্ট মেমরি নেই।

আমি কি আরও ভাল অ্যালগরিদম ব্যবহার করতে পারি? লুক-টেবিল ব্যবহার করে এবং কী তৈরি করা কি আমার সমস্যার সমাধান করা সম্ভব?


1
আপনি বর্তমানে কোন অ্যালগরিদম ব্যবহার করেন? সাতটি পূর্ণসংখ্যার তুলনা যথেষ্ট, এটি কি খুব ধীর? আপনার hashইতিমধ্যে আরও অপারেশন করা হয়। পদ্ধতির পরবর্তী কলগুলি কি সম্পর্কিত, উদাহরণস্বরূপ xম্যাট্রিক্স সারি-দ্বারা-সারি মধ্য দিয়ে কেন্দ্রীয় স্থানান্তরিত হয়?
রাফেল

ফিল্টারটি সারিবদ্ধভাবে চিত্রের মাধ্যমে সজ্জিত হয়। অর্থাত্ 5 টি মান পাবেন এবং গণনাগুলি করুন তারপরে সবকিছুকে এক ধাপ ডান দিকে সরান এবং পুনরাবৃত্তি করুন। হ্যাশটি কেবল একটি উদাহরণ ছিল। আমি ডেটা পড়া কমানোর জন্য বেশ কয়েকটি স্লাইডিং-উইন্ডো সমাধানগুলিকে বেঞ্চমার্ক করেছি তবে এটি সবগুলি সর্বোচ্চ 2 টি মান খুঁজে বের করতে পারে।
ফ্রেডরিক পিহল

3
সম্ভবত আপনার অ্যালগরিদম, যদি সঠিকভাবে প্রয়োগ করা হয়, তা গণনা দ্বারা নয় মেমরি অ্যাক্সেস দ্বারা আবদ্ধ হবে। হ্যাশ টেবিল ব্যবহার করা কেবল মেমরির অ্যাক্সেসের পরিমাণ বাড়িয়ে দেয় এবং জিনিসকে ধীর করে দেয়। দয়া করে আপনার বর্তমান কোডটি পোস্ট করুন যাতে এটি কীভাবে উন্নতি করা যায় তা আমরা দেখতে পারি - আমি বিশ্বাস করি কেবলমাত্র মাইক্রো-অপ্টিমাইজেশন সম্ভব। সর্বাধিক আমি ভাবতে পারি: সম্ভবত আমরা প্রতিবেশী উইন্ডোগুলির মধ্যে 2 টি মান সমান যে সত্যটি গ্রহণ করতে পারি?
jkff

@jkff ম্যাট্রিক্স, ক্যাশে আকার এবং (ক্যাশে) ম্যাপিং ফাংশনের উপর নির্ভর করে প্রতিটি মান কেবল একবার লোড করতে হতে পারে; বেশিরভাগ অপারেশনগুলি তখন রেজিস্টার বা এল 1 ক্যাশে চালানো উচিত। পাইপলাইনিং আরেকটি বিষয়, যদিও।
রাফেল

1
যাইহোক, আপনি কি ইতিমধ্যে সমান্তরালভাবে এটি করেন? এটি ভেক্টর সমান্তরালতা বা সিমডি (যেমন একটি জিপিইউতে) জন্য বিশেষভাবে উপযুক্ত বলে মনে হয়। এই রুটটি প্রতি ঘরে কয়েক শতাংশ সংরক্ষণের চেয়ে অনেক বেশি সহায়তা করবে।
রাফেল

উত্তর:


11

আমার অন্য উত্তরে আমি পরামর্শ দিচ্ছি যে শর্তাধীন জাম্পগুলি দক্ষতার প্রধান প্রতিবন্ধক হতে পারে। ফলস্বরূপ, বাছাই করা নেটওয়ার্কগুলি মাথায় আসে: এগুলি ডেটা অজিনস্টিক that একই তুলনাটির ক্রমটি ইনপুট নির্বিশেষে কার্যকর করা হয়, কেবলমাত্র অদলবদল শর্তযুক্ত।

অবশ্যই, বাছাই করা খুব বেশি কাজ হতে পারে; আমাদের কেবল সবচেয়ে বড় দুটি সংখ্যা দরকার। আমাদের জন্য ভাগ্যবান, সিলেকশন নেটওয়ার্কগুলিও অধ্যয়ন করা হয়েছে। নুথ আমাদের জানান যে পাঁচটির মধ্যে দু'টি ক্ষুদ্রতম সংখ্যার সন্ধানটি তুলনা [1, 5.3.4 প্রাক্তন 19] (এবং সর্বাধিক সংখ্যক অদলবদল) দিয়ে করা যেতে পারে।U^2(5)=6

সমাধানগুলিতে তিনি যে নেটওয়ার্কটি দেন তা হ'ল (শূন্য-ভিত্তিক অ্যারেগুলিতে লিখিত)

[0:4][1:4][0:3][1:3][0:2][1:2]

যা প্রয়োগ করে - তুলনার দিক সমন্বয় করার পরে - সিউডোকোড হিসাবে in

def selMax2(a : int[])
  a.swap(0,4) if a[0] < a[4]
  a.swap(1,4) if a[1] < a[4]
  a.swap(0,3) if a[0] < a[3]
  a.swap(1,3) if a[1] < a[3]
  a.swap(0,2) if a[0] < a[2]
  a.swap(1,2) if a[1] < a[2]
  return (a[0], a[1])
end

এখন, নিষ্পাপ বাস্তবায়নগুলিতে এখনও শর্তযুক্ত জাম্প রয়েছে (অদলবদল জুড়ে)। আপনার মেশিনের উপর নির্ভর করে আপনি শর্তযুক্ত নির্দেশাবলীর সাহায্যে এগুলি চালিত করতে পারেন। x86 মনে হচ্ছে এটির স্বাভাবিক মুডপিট স্ব; দৃশ্যত বেশিরভাগ অপারেশনগুলি নিজের মধ্যে শর্তাধীন হওয়ার কারণে এআরএম আরও প্রতিশ্রুতিবদ্ধ দেখাচ্ছে । যদি আমি নির্দেশাবলীটি সঠিকভাবে বুঝতে পারি তবে আমাদের অ্যারির মানগুলি রেজিস্টারে লোড করা হয়েছে ধরে ধরেই প্রথম অদলবদলে এটি অনুবাদ করা R0হয় R4:

CMP     R0,R4
MOVLT   R5 = R0
MOVLT   R0 = R4
MOVLT   R4 = R6

হ্যাঁ, হ্যাঁ, অবশ্যই আপনি ইওআর এর সাথে এক্সওআর অদলবদল করতে পারেন ।

আমি কেবল আশা করি আপনার প্রসেসরের এটি বা এটির মতো কিছু রয়েছে। অবশ্যই আপনি যদি এই উদ্দেশ্যে এই জিনিসটি তৈরি করেন তবে সম্ভবত আপনি সেখানে নেটওয়ার্কটি হার্ড-ওয়্যার্ড পেতে পারেন?

ক্লাসিকাল রাজ্যে আপনি সম্ভবত এটি করতে পারেন (সম্ভাব্য?) সেরা, অর্থাত্ সীমাবদ্ধ ডোমেনটি ব্যবহার না করে এবং দুষ্টু আন্তঃ-শব্দ জাদুগুলি সম্পাদন না করে।


  1. ডোনাল্ড ই নূথ দ্বারা বাছাই এবং অনুসন্ধান ; আর্ট অফ কম্পিউটার প্রোগ্রামিং ভলিউম। 3 (দ্বিতীয় সংস্করণ, 1998)
  2. নোট করুন যে এটি দুটি নির্বাচিত উপাদানকে সীমানাবিহীন রেখে দেয়। তাদের অর্ডার করার জন্য একটি অতিরিক্ত তুলনা প্রয়োজন, এটি হ'ল মোট মোট [1, পি 234 সারণী 1]।W^2(5)=7

আমি এই গ্রহণ করছি। আমি প্রচুর নতুন ধারণা পেয়েছি যা এগিয়ে যাওয়ার আগে আমার বেঞ্চমার্ক করা দরকার। নুথকে উল্লেখ করা সর্বদা আমার জন্য কাজ করে :-) আপনার প্রচেষ্টা এবং সময়টির জন্য ধন্যবাদ!
ফ্রেডরিক পিহল

@ ফ্রেডরিক পিহল শীতল, দয়া করে আমাদের জানান কীভাবে এটি শেষ হয়!
রাফেল

আমি করব! এখনই অধ্যায় 5.3.3 পড়া হচ্ছে Read এর
শুরুটি

2
নির্দেশিকাটির উপর নির্ভর করে নির্বাচন নেটওয়ার্কের সাথে 2 * সর্বোচ্চ (a, b) = a + b + অ্যাবস (অ্যাব) ব্যবহার করা কার্যকর হতে পারে; এটি অপ্রত্যাশিত শর্তাধীন জাম্পের চেয়ে কম ব্যয়বহুল হতে পারে (এমনকি অ্যাবসগুলির জন্য অন্তর্নিহিত বা শর্তযুক্ত পদক্ষেপ ছাড়াই: জিসিসি, কমপক্ষে x86 এর জন্য, একটি জাম্পবিহীন ক্রম তৈরি করে যা x86 এর উপর নির্ভরশীল বলে মনে হয় না)। সিমডি বা জিপিইউর সাথে একত্রিত হলে জাম্পলেস সিকোয়েন্স থাকাও দরকারী।
এপ্রোগ্রামার

1
নোট করুন যে বাছাই নেটওয়ার্কগুলি (বাছাই নেটওয়ার্কগুলির মতো) সমান্তরাল ক্রিয়াকলাপের জন্য উপযুক্ত men বিশেষত নির্বাচিত নেটওয়ার্কে, তুলনা 1: 4 এবং 0: 3 সমান্তরালে সঞ্চালিত হতে পারে (যদি প্রসেসর, সংকলক, ইত্যাদি যে দক্ষতার সাথে সমর্থন করে), এবং তুলনা 1: 3 এবং 0: 2 এছাড়াও সমান্তরালভাবে সম্পাদন করা যেতে পারে।
ব্রুস লিলি

4

এটি কেবল টেবিলে রয়েছে, এখানে একটি প্রত্যক্ষ অ্যালগরিদম রয়েছে:

// Sort x1, x2
if x1 < x2
  M1 = x2
  m1 = x1
else
  M1 = x1
  m1 = x2
end

// Sort x3, x4
if x3 < x4
  M2 = x4
  m2 = x3
else
  M2 = x3
  m2 = x4
end

// Pick largest two
if M1 > M2
  M3 = M1
  if m1 > M2
    m3 = m1
  else
    m3 = M2
  end
else
  M3 = M2
  if m2 > M1
    m3 = m2
  else
    m3 = M1
  end
end

// Insert x4
if x4 > M3
  m3 = M3
  M3 = x4
else if x4 > m3
  m3 = x4
end

চতুর প্রয়োগের মাধ্যমে if ... else, প্রত্যক্ষ অনুবাদে যে কোনও শর্তহীন জাম্প থেকে মুক্তি পাওয়া যায়।

এটি কুৎসিত তবে কেবল লাগে

  • পাঁচ বা ছয় তুলনা (শর্তসাপেক্ষ জাম্প),
  • নয় থেকে দশ অ্যাসাইনমেন্ট (১১ টি ভেরিয়েবল সহ, সমস্ত রেজিস্টারে রয়েছে) এবং
  • কোনও অতিরিক্ত মেমরি অ্যাক্সেস নেই।

প্রকৃতপক্ষে, এই সমস্যাটির জন্য ছয়টি তুলনাটি সর্বোত্তম, [1] শোয়ের 5.3.3 বিভাগের থিওরেম এস হিসাবে; এখানে আমাদের ।W2(5)

পাইপলাইনিং সহ মেশিনগুলিতে এটি দ্রুত হবে বলে আশা করা যায় না; শর্তসাপেক্ষে লাফিয়ে তাদের উচ্চ শতাংশ দেওয়া, বেশিরভাগ সময় সম্ভবত স্টলে ব্যয় হবে।

নোট করুন যে একটি সহজ বৈকল্পিক - সাজান x1এবং x2তারপরে অন্যান্য মানগুলি সন্নিবেশ করান - চার থেকে সাত তুলনা এবং কেবল পাঁচ থেকে ছয়টি কার্যাদি লাগে। যেহেতু আমি এখানে জাম্পগুলি বেশি দামের আশা করব, তাই আমি এটির সাথে আটকে গেলাম।


  1. ডোনাল্ড ই নূথ দ্বারা বাছাই এবং অনুসন্ধান ; আর্ট অফ কম্পিউটার প্রোগ্রামিং ভলিউম। 3 (দ্বিতীয় সংস্করণ, 1998)

আমি আশ্চর্য হই যে একটি অনুকূলিতকরণ সংকলক এগুলি কী করতে পারে।
রাফেল

আমি এটি বাস্তবায়ন করব এবং এটি বর্তমান সিএলজেড-ভিত্তিক সমাধানের বিপরীতে করব। আপনার সময় জন্য ধন্যবাদ!
ফ্রেডরিক পিহল

1
@ ফ্রেড্রিকপিহল আপনার মানদণ্ডের ফলাফল কী ছিল?
রাফেল

1
সোয়াপ-ভিত্তিক পন্থা সিএলজেডকে মারধর করে! এখন মোবাইলে। মোবাইলে এখনই আরও ডেটা পোস্ট করতে পারেন
ফ্রেডরিক পিহল

@ ফ্রেড্রিক পিহল শীতল! আমি খুশী ভাল পুরাতন তত্ত্ব পদ্ধতির (এখনও) ব্যবহারিক ব্যবহার হতে পারে। :)
রাফেল

4

এটি স্যুপার প্রকল্পের জন্য দুর্দান্ত আবেদন এবং পরীক্ষার কেস হতে পারে । সুপার হ'ল একটি সুপারোটিমাইজার - এমন একটি সরঞ্জাম যা ইনপুট হিসাবে কোডের একটি সংক্ষিপ্ত ক্রম নেয় এবং যথাসম্ভব এটিকে অপ্টিমাইজ করার চেষ্টা করে (দ্রুততর কোডের সমতুল্য সিকোয়েন্সটি সন্ধান করার চেষ্টা করে)।

স্যুপার ওপেন সোর্স। আপনার কোড স্নিপেটে স্যুপার চালানোর চেষ্টা করুন এটি আরও ভাল কিছু করতে পারে কিনা তা দেখার জন্য।

16 4-বিট মানগুলিকে সাজানোর জন্য দ্রুত কোড লেখার বিষয়ে জন রেগারের প্রতিযোগিতাটি দেখুন ; এটি সম্ভব যে সেখানে কিছু কৌশল কার্যকর হতে পারে।


ওপি চেষ্টা করছে এমন প্রোগ্রামগুলিতে এটি কী করতে পারে তাতে আমি আগ্রহী।
রাফেল

3

আপনি একটি ব্যবহার করতে পারেন 213টেবিল যা তিনটি পূর্ণসংখ্যা পায় এবং বৃহত্তম দুটিকে আউটপুট দেয়। তারপরে আপনি তিনটি টেবিল লুকআপ ব্যবহার করতে পারেন:

T[T[T[441*a+21*b+c]*21+d]*21+e]

একইভাবে, ক ব্যবহার করে 214 টেবিল, আপনি এটি দুটি টেবিল লকআপে হ্রাস করতে পারেন, যদিও এটি স্পষ্ট নয় যে এটি আরও দ্রুত হবে।

আপনি যদি সত্যিই একটি ছোট টেবিল চান তবে আপনি দুটি ব্যবহার করতে পারেন 212টেবিল দুটি সংখ্যা "সাজানোর" জন্য এবং তারপরে একটি বাছাইকরণ নেটওয়ার্ক ব্যবহার করুন। উইকিপিডিয়া অনুসারে , এর জন্য সর্বাধিক 18 টেবিল লুকআপ (9 তুলনামূলক) প্রয়োজন; আপনি (1) যেহেতু কেবলমাত্র দুটি বৃহত উপাদানগুলি জানতে চান এবং (2) কিছু তুলনামূলক গেটের জন্য আপনি কেবলমাত্র কমপক্ষে আগ্রহী হতে পারেন সেহেতু আপনি কম করতে সক্ষম হবেন।

আপনি একটি একক ব্যবহার করতে পারেন 212টেবিল। বাছাইয়ের নেটওয়ার্কটি প্রয়োগ করে তারপরে কম মেমরি অ্যাক্সেসগুলি ব্যবহার করে তবে আরও গাণিতিক। এইভাবে আপনি সর্বাধিক 9 টেবিলের অনুসন্ধান পাবেন।

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