ডুপ্লিকেটগুলি দক্ষতার সাথে এবং কম মেমরির ওভারহেড সহ সরানো


9

আমি ডুপ্লিকেটগুলির জন্য পূর্ণসংখ্যার একটি তালিকা এমনভাবে দক্ষতার সাথে ফিল্টার করতে চাই যাতে কেবল ফলাফলের সেটটি সঞ্চয় করা দরকার।

এটি একটি উপায় দেখা যায়:

  • আমরা পূর্ণসংখ্যার একটি পরিসীমা আছে S={1,,N} সঙ্গে N বড় (বলুন) 240)
  • আমাদের একটা ফাংশন আছে f:SS মনে হয়, অনেক সংঘর্ষের সাথে (চিত্রগুলি অভিন্নভাবে বিতরণ করা হয়) S)
  • আমাদের তখন স্টোর করা দরকার f[S], এটাই {f(x)|xS}

আমার কিসের একটি সঠিক (সম্ভাব্য) ধারণা রয়েছে |f[S]| হয়, এবং অতএব ডেটা স্ট্রাকচারগুলি আগাম বরাদ্দ করতে পারে (বলুন |f[S]|230)।

আমার কয়েকটি ধারণা ছিল তবে আমি নিশ্চিত নই যে সর্বোত্তম পন্থাটি কী হবে:

  • একটি বিটসেট প্রশ্নের বাইরে আছে কারণ ইনপুট সেট মেমরির সাথে খাপ খায় না।
  • একটি হ্যাশ টেবিল, তবে (1) এর জন্য কিছুটা মেমরির ওভারহেড প্রয়োজন, এর 150% বলুন |f[S]| এবং (2) সারণীটি তৈরির সময় অন্বেষণ করতে হবে যা মেমরির ওভারহেডের কারণে অতিরিক্ত সময় প্রয়োজন।
  • একটি "ফ্লাই অন" বাছাই করুন, পছন্দ সহকারে O(N)জটিলতা (অ তুলনা বাছাই)। সে সম্পর্কে, আমি নিশ্চিত নই যে বালতি বাছাই এবং ফ্ল্যাশসোর্টের মধ্যে প্রধান পার্থক্য কী
  • বাইনারি অনুসন্ধান ট্রি সহ একটি সাধারণ অ্যারে, তবে এটির প্রয়োজন O(Nlog|f[S]|) সময়।
  • হতে পারে ব্লুম ফিল্টার বা অনুরূপ ডেটা স্ট্রাকচার ব্যবহার করে সমস্যার এক শিথিলকরণ (মিথ্যা ধনাত্মক সহ) দরকারী হতে পারে।

স্ট্যাকওভারফ্লো সম্পর্কিত কিছু প্রশ্ন এই ধরণের জিনিসগুলির সাথে মোকাবেলা করছে বলে মনে হয় ( /programming/12240997/sorting-array-in-on-run-time , /programming/3951547/java -আরে-সন্ধানী-সদৃশ ) তবে কোনওটিই আমার প্রয়োজনীয়তার সাথে মেলে না।


2
আপনার কি চ [এস] গণনা করতে হবে (এটি যাই হোক না কেন), বা এটিতে কিছু এক্স রয়েছে কিনা তা দ্রুত বলতে সক্ষম হবেন?
গিলস 'এস-অশুভ হওয়া বন্ধ করুন'

@ গিলস: আমি বিশ্বাস করি যেহেতু চ [এস] তে কোনও সুস্পষ্ট কাঠামো পাওয়া যায় না, দুটি সমাধান সমান are
ডক

আপনার সংখ্যা যোগ হয় না। আকারের একটি ডোমেনে এলোমেলো ফাংশনের প্রত্যাশিত চিত্রN মোটামুটি (11/e)N। আর একটি বিষয় হচ্ছে এর মধ্য দিয়ে যাওয়া256আপনার কাছে সুপার কম্পিউটার বা বড় ক্লাস্টার না থাকলে খুব বেশি সময় লাগবে।
যুবাল ফিল্মাস

1
বাইনারি অনুসন্ধান গাছের জন্য সময় হবে O(Nlog|f[S]|), যা কাছাকাছি বা নাও হতে পারে O(NlogN)অনুশীলনে তবে এখনও আরও সঠিক।
jmad

1
সঙ্গে N256, লিনিয়ার টাইম অ্যালগোরিদমও কি নিষিদ্ধ হবে না? (আমার গণনা থেকে, এমনকি যদি আপনি একটি উপাদান বিবেচনা করেনS1 ন্যানো সেকেন্ডে, এটি আপনাকে 2 বছর ভাল লাগবে!)।
আর্যভাটা

উত্তর:


1

বিন এবং চেইন কেন?

ধারণাটি হ'ল ধনাত্মক পূর্ণসংখ্যার দ্বারা উপস্থাপিত store n=k+m একটি অ্যারে বিট A এর 2k মানগুলির ব্যাপ্তিগুলির প্রতিনিধিত্বকারী এন্ট্রি: এন্ট্রি A[y], y0, পরিসীমা প্রতিনিধিত্ব করে [2my,2m(y+1)1]। কোন জন্য1x<2n আমরা লিখতে পারি x=2my+z কোথায় y হয়েছে k বিট এবং z হয়েছে mবিট। সংরক্ষণ করার চেষ্টা করুনz (না x!) অবস্থান y:

  • কখন A[y]=z ইতিমধ্যে, কিছুই করবেন না: x একটি সদৃশ।

  • কখন A[y] অবিচ্ছিন্ন, দোকান zA[y]

  • অন্যথায়, শৃঙ্খলাবদ্ধ করতে ব্যবহৃত একটি আলাদা অ্যারেতে একটি সূচক সংরক্ষণ করুন zএর (যা সংঘর্ষে পড়েছে) y) লিঙ্কযুক্ত তালিকায়। নেতৃত্বাধীন তালিকার মাধ্যমে আপনাকে রৈখিকভাবে অনুসন্ধান করতে হবেA[y] এবং কী অনুসন্ধান সন্ধান করে তা নির্ভর করে, সম্ভাব্য inোকান z তালিকায়।

শেষে, f(S) প্রারম্ভিক এন্ট্রিগুলির মাধ্যমে লুপ করে পুনরুদ্ধার করা সহজ A এবং - কেবল দুটি বিটস্ট্রিংগুলি - প্রতিটি পুনরায় একত্রিত করে z লোকেশন এ পাওয়া গেছে y (হয় প্রত্যক্ষভাবে বা সেখানে উল্লেখ করা শৃঙ্খলের মধ্যে) মূল মান হিসাবে x=2my+z

বিতরণ যখন ইউনিফর্মের কাছাকাছি হয় এবং 2k অতিক্রম করে N, খুব বেশি শৃঙ্খলা হবে না (এটি সাধারণ উপায়ে মূল্যায়ন করা যেতে পারে) এবং চেইনগুলি সংক্ষিপ্ত হবে। যখন বিতরণটি অ-ইউনিফর্ম হয়, তখনও অ্যালগরিদম কাজ করে তবে চতুর্ভুজীয় সময়ে পৌঁছতে পারে। যদি এটির কোনও সম্ভাবনা থাকে তবে চেইনের চেয়ে আরও কার্যকর কিছু ব্যবহার করুন (এবং স্টোরেজের জন্য কিছুটা ওভারহেড প্রদান করুন)।

প্রয়োজনীয় সঞ্চয়স্থান সর্বাধিক is 2n জন্য বিট A এবং 22k চেইনের জন্য বিট (ধরে নিচ্ছি) mk)। এটি সঞ্চয় করার জন্য ঠিক স্থান দরকার2k এর মান nবিট প্রতিটি। আপনি যদি অভিন্নতার বিষয়ে আত্মবিশ্বাসী হন তবে আপনি চেইনের জন্য স্টোরেজকে অবমূল্যায়ন করতে পারেন। নন-ইউনিফর্মিটি যদি কোনও সম্ভাবনা থাকে তবে আপনি বাড়াতে চাইতে পারেনk এবং পুরোপুরি চেইন স্টোরেজটির পক্ষে পরামর্শ দিন।

এই সমাধান সম্পর্কে চিন্তা একটি বিকল্প উপায় যে এটা হল একটি বিশেষ চমৎকার হ্যাশ ফাংশন সঙ্গে একটি হ্যাশ টেবিল (নেওয়াk সর্বাধিক তাৎপর্যপূর্ণ বিট) এবং এর কারণে আমাদের কেবলমাত্র কমপক্ষে তাৎপর্যপূর্ণ সঞ্চয় করা দরকার m=nk টেবিল বিট।

চেইনগুলির জন্য স্টোরেজ সহ স্টোরেজ ওভারলে করার উপায় রয়েছে A তবে এটি বিরক্তিকর বলে মনে হচ্ছে না, কারণ এটি বেশি পরিমাণে সাশ্রয় করবে না (ধরে নিচ্ছি) m তুলনায় অনেক ছোট k) স্পেস এবং কোডটি বিকাশ, ডিবাগ, এবং বজায় রাখা আরও শক্ত করে তুলবে।


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

তাহলেই এইই Θ(n2)খারাপভাবে বিতরণ করা ইনপুটগুলিতে। আমি জানি না এটি কীভাবে দক্ষ।
einpoklum

@ আইনপোকলুম এই উত্তরটি স্পষ্টভাবে বর্ণনামূলকভাবে যে পরিস্থিতিতে সমাধানটি কার্যকর solution
শুক্রবার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.