অ্যালগরিদম: একটি অ্যারের থেকে সদৃশ পূর্ণসংখ্যার অপসারণের কার্যকর উপায়


93

আমি এই সমস্যাটি মাইক্রোসফ্টের সাথে একটি সাক্ষাত্কার থেকে পেয়েছি।

এলোমেলো পূর্ণসংখ্যার অ্যারে দেওয়া, সিতে একটি অ্যালগরিদম লিখুন যা সদৃশ সংখ্যাগুলি সরিয়ে দেয় এবং মূল অ্যারেতে স্বতন্ত্র সংখ্যাগুলি ফিরিয়ে দেয়।

উদাহরণস্বরূপ ইনপুট: {4, 8, 4, 1, 1, 2, 9} আউটপুট:{4, 8, 1, 2, 9, ?, ?}

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

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

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


4
আপনার কি অনন্য সংখ্যার ক্রম সংরক্ষণ করতে হবে?
ডগলাস লিডার 16

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

4
আমি প্রশ্ন আপডেট করেছি। ফলাফলটি মূল অ্যারেতে ফিরে আসতে হবে। তবে, ক্রমটির ক্রমটি কোনও ব্যাপার নয়।
ejel

4
যখন কেউ প্রশ্ন এবং অন্যান্য উত্তরগুলির উপর তাদের উত্তরগুলি ফুটিয়ে তোলে তখন এটি বেশ বিরক্তিকর। শুধু ধৈর্য ধরুন, লোকেরা সেখানে পাবেন।
GManNickG

4
কেন হ্যাশটেবল অনুমোদিত নয়? এই সীমাবদ্ধতার কোনও মানে হয় না।
আরবেরি ইয়ং

উত্তর:


20

কেমন:

ও (এন ^ 2) বা তার চেয়ে কম হওয়া উচিত।


4
এটি সহজ সমাধান এবং সম্ভবত সাক্ষাত্কারের প্রশ্নটি যা খুঁজছে তার চেয়ে বেশি।
কર્ક ব্রডহর্স্ট

8
তারা এমনকি এটি পরীক্ষা করে দেখছে যে আপনি অকালীন অপ্টিমাইজেশনে জড়িত না হন যদি না তারা আপনাকে রানটাইম সীমাবদ্ধতা না দেয় তবে! :-)
ট্রেভর টিপ্পিনস

16
লল, যদিও অ্যারেটি বাছাই করা এবং সাজানো অনুসারে কাজ করা সুনির্দিষ্টভাবে দ্রুত। বাছাই একটি এপিআই দ্বারা সরবরাহ করা উচিত এবং imho কোন অকাল অপ্টিমাইজেশন হয়।
ziggystar

4
এটি (বর্তমান <শেষ) হওয়ার পরিবর্তে (বর্তমান <শেষ) হওয়া উচিত নয়?
শাইল

4
কেন এটি সঠিক উত্তর হিসাবে গৃহীত হয়েছিল? যদি অর্ডার সংরক্ষণের প্রয়োজন না হয় তবে কেবল মার্জ সাজ্ট ও (নলগন) ব্যবহার করা এবং তারপরে ও (এন) এর পুনরাবৃত্ত উপাদানগুলি সরিয়ে ফেলা ভাল নয় ... মোট জটিলতা - ও (নলগন) যা এই সমাধানের চেয়ে অনেক ভাল।
পবন

136

আমার গার্লফ্রেন্ড দ্বারা প্রস্তাবিত একটি সমাধান হ'ল মার্জ সাজানোর একটি প্রকরণ। একমাত্র পরিবর্তনটি হ'ল মার্জ পদক্ষেপের সময় কেবল নকল মানগুলিকে উপেক্ষা করুন। এই সমাধানটি পাশাপাশি ও (এন লগ এন) হবে। এই পদ্ধতিতে, বাছাই / সদৃশ অপসারণ একসাথে একত্রিত হয়। তবে, আমি নিশ্চিত নই যে এটির কোনও তফাত আছে কিনা makes


8
দুর্দান্ত পরামর্শ, তবে প্রতিটি মার্জ আউটপুটের শেষের ট্র্যাক রাখতে আপনার কিছু বুককিপিং দরকার। আমি আসলে এটি একবার করেছি, এবং হ্যাঁ আপনি সংযুক্ত হওয়ার সাথে সদৃশগুলি মুছে ফেলা এটি আরও দ্রুত করে তোলে makes
মার্ক র্যানসম

4
এই প্রশ্নে ও (এন / 2) অতিরিক্ত স্থানকে "সহায়ক তথ্য কাঠামো" হিসাবে নিষিদ্ধ করা হয়েছে কিনা তা পরিষ্কার নয় - এই নিষেধাজ্ঞার জন্য ও (1) অতিরিক্ত স্থান নির্ধারিত করা হয়েছে কিনা তা আমি জানি না বা কেবল নির্ধারণ করার জন্যই উত্তরটি একটি বড় অল 'ডাটা স্ট্রাকচার বাস্তবায়নের উপর নির্ভর করবে না। সম্ভবত একটি স্ট্যান্ডার্ড মার্জ ঠিক আছে। তবে যদি তা না হয় তবে শীর্ষ পরামর্শ: কোনও সাক্ষাত্কারে কোনও স্থানের মধ্যে মার্জ বাছাই করার চেষ্টা করবেন না, যদি না আপনি সত্যিই জানেন যে আপনি কী করছেন।
স্টিভ জেসপ

ভালো বুদ্ধি. তবে এটি প্রয়োজন যে বাকী ডেটা মূল ক্রম রাখে।
হার্ডি ফেং

4
একটি কাগজ যা আপনার বান্ধবী প্রস্তাবিত তা বর্ণনা করে: dc-pubs.dbs.uni-leipzig.de/files/…
মাইক বি

50

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

  1. অ্যারের প্রথম উপাদানটি ধরুন, এটি সেন্ডিনেল হবে।
  2. যথাসম্ভব যথাক্রমে বাকি অ্যারেটি পুনঃক্রম করুন, যেমন প্রতিটি উপাদান তার হ্যাশের সাথে সম্পর্কিত অবস্থানে থাকে। এই পদক্ষেপটি শেষ হওয়ার সাথে সাথে সদৃশগুলি আবিষ্কার করা হবে। এগুলি সেন্ডিনেলের সমান করুন।
  3. অ্যারের শুরুতে সূচিপত্র হ্যাশের সমান এমন সমস্ত উপাদান সরিয়ে নিন।
  4. অ্যারের প্রথম উপাদান ব্যতীত, অ্য্রেন্ডির শেষে এলিমেন্টের সমান, সমস্ত উপাদান সরান।
  5. সঠিকভাবে হ্যাশ হওয়া উপাদানগুলি এবং সদৃশ উপাদানগুলির মধ্যে যা অবশিষ্ট রয়েছে তা হ'ল সংঘর্ষের কারণে তাদের হ্যাশের সাথে সূচকগুলিতে স্থাপন করা যায়নি। এই উপাদানগুলির সাথে কাজ করার জন্য পুনরাবৃত্তি করুন।

এটি হে (এন) হ্যাশিংয়ে কোনও প্যাথলজিকাল দৃশ্যের সরবরাহ না করে দেখানো যেতে পারে: এমনকি কোনও নকল না থাকলেও প্রতিটি পুনরাবৃত্তিতে প্রায় 2/3 উপাদানগুলি মুছে ফেলা হবে। পুনরাবৃত্তির প্রতিটি স্তর হ'ল (এন) যেখানে ছোট এন হ'ল উপাদানগুলির পরিমাণ। একমাত্র সমস্যাটি হ'ল, অনুশীলনে, খুব শীঘ্রই ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে কম সংখ্যক সংঘর্ষ হয় there তবে, যখন বিপুল পরিমাণে সদৃশ হয়, এটি আশ্চর্যরকম দ্রুত fast

সম্পাদনা: ডি এর বর্তমান বাস্তবায়নে হ্যাশ_টি 32 বিট। এই অ্যালগরিদম সম্পর্কে সমস্ত কিছু ধরে নেয় যে খুব 32, বিট স্পেসে হ্যাশের সংঘর্ষ খুব কম হবে। সংঘর্ষগুলি অবশ্য মডিউলাস স্পেসে ঘন ঘন ঘটতে পারে। যাইহোক, এই ধারনাটি কোনও যুক্তিসঙ্গত আকারের ডেটা সেটের জন্য সমস্ত ক্ষেত্রেই সত্য। কীটি 32 বিটের চেয়ে কম বা সমান হলে এটি নিজস্ব হ্যাশ হতে পারে, যার অর্থ 32-বিট স্পেসে পূর্ণ সংঘর্ষ অসম্ভব। যদি এটি বড় হয় তবে সমস্যা হওয়ার জন্য আপনি কেবলমাত্র তাদের যথেষ্ট পরিমাণে 32-বিট মেমরি ঠিকানার জায়গাতে ফিট করতে পারবেন না। আমি ধরে নিয়েছি হ্যাশ_টি ডি-এর 64-বিট বাস্তবায়নে 64 বিটে বাড়ানো হবে, যেখানে ডেটাসেটগুলি আরও বড় হতে পারে। তদ্ব্যতীত, যদি এটি কখনও সমস্যা হিসাবে প্রমাণিত হয়, তবে প্রত্যেকটি পুনরাবৃত্তির প্রতিটি স্তরে হ্যাশ ফাংশন পরিবর্তন করতে পারে।

ডি প্রোগ্রামিং ভাষায় এখানে একটি বাস্তবায়ন রয়েছে:


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

20

আরও একটি কার্যকর বাস্তবায়ন

এই প্রয়োগে অ্যারে বাছাই করার প্রয়োজন নেই। এছাড়াও যদি কোনও সদৃশ উপাদান পাওয়া যায় তবে এর পরে সমস্ত উপাদানকে একটি অবস্থানের সাথে স্থানান্তর করার দরকার নেই।

এই কোডটির আউটপুট অ্যারে [] মাপের নতুন দৈর্ঘ্য সহ is

এখানে আমরা অ্যারের মধ্যে দ্বিতীয় এলেমেট থেকে শুরু করছি এবং অ্যারের সমস্ত উপাদানগুলির সাথে এই অ্যারে পর্যন্ত তুলনা করছি। ইনপুট অ্যারে সংশোধন করার জন্য আমরা একটি অতিরিক্ত সূচক ভেরিয়েবল 'NewLength' ধারণ করছি। নিউলেন্থ ভেরিয়েবেল 0 এ শুরু করা হয়েছে।

অ্যারেতে উপাদানটি [1] অ্যারের সাথে তুলনা করা হবে [0]। যদি সেগুলি পৃথক হয়, তবে অ্যারের মান [NewLength] অ্যারে [1] এবং ইনক্রিমেন্ট NewLength দ্বারা সংশোধিত হবে। যদি সেগুলি একই হয় তবে নিউলেন্থ পরিবর্তন করা হবে না।

সুতরাং আমাদের যদি একটি অ্যারে থাকে [1 2 1 3 1], তবে

'জ' লুপের প্রথম পাসে, অ্যারে [1] (2) এর সাথে অ্যারের 0 এর সাথে তুলনা করা হবে, তারপরে 2 অ্যারেতে লিখিত হবে [নিউলেন্থ] = অ্যারে [1] সুতরাং অ্যারে [1 2] হবে নিউ লেন্থ = 2 থেকে

'জ' লুপের দ্বিতীয় পাসে অ্যারে [2] (1) অ্যারে 0 এবং অ্যারে 1 এর সাথে তুলনা করা হবে। এখানে অ্যারে [2] (1) এবং অ্যারে 0 একই লুপটি এখানে ভেঙে যাবে। নিউ অ্যারেথ = 2 থেকে অ্যারে [1 2] হবে

ইত্যাদি


4
সুন্দর. আমার উন্নতি করার পরামর্শ রয়েছে। দ্বিতীয়ত নেস্টেড লুপ জন্য পরিবর্তন করা যাবে (ঞ = 0; ঞ <NewLength; ঞ ++,) এবং শেষ হলে পরীক্ষণ পরিবর্তন করা যাবে যদি (ঞ == NewLength) এর
Vadakkumpadath

এটি একটি দুর্দান্ত সুগারেশন ছিল। আমি আপনার মন্তব্যের ভিত্তিতে কোডটি আপডেট করেছি
বাইজু

অ্যারে ail 1,1,1,1,1,1 1 এ আমাদের একই মান থাকলে ব্যর্থ} অকেজো কোড।
ইউরি চের্নিশভ

আচ্ছা এর জটিলতা কী, এটিও ও (এন ^ 2) নয়?
জাভাসা

4
অনেকগুলি আপোভেটস, তবে এটি দক্ষ নয়: কয়েকটি অনুলিপি থাকার সময় এটি ও (এন ^ 2) হয়।
পল হানকিন

19

আপনি যদি উচ্চতর ও-স্বীকৃতি সন্ধান করছেন তবে তারপরে একটি ও (এন লগ এন) বাছাই করে অ্যারে বাছাই করলে একটি হে (এন) ট্র্যাভারসাল করা সর্বোত্তম পথ হতে পারে। বাছাই না করে আপনি ও (এন ^ 2) এর দিকে তাকিয়ে আছেন।

সম্পাদনা করুন: আপনি যদি কেবল পূর্ণসংখ্যা করছেন তবে ও (এন) পেতে আপনি রডিক্স বাছাইও করতে পারেন।


জেফ বি এর উত্তরটি কেবল ও (এন)) হ্যাশ-সেট এবং হ্যাশ-অভিধান হ'ল মৌমাছির হাঁটু।
ক্রিসডাব্লু 17

4
ক্রিসডাব্লু: হ্যাশ সেট / অভিধানগুলি কেবল ও (1) হয় যদি আপনি কোনও সংঘর্ষ না ধরে থাকেন। (আমি বলছি না যে আমি তাদের এই সমস্যার জন্য ব্যবহার করব না - আমি সম্ভবত - এটি সত্য যে তারা ও (1) বলে দাবি করা কেবল একটি মিথ্যাবাদ।)
লরেন্স গনসাল্ভেস

4
আসলে, যেহেতু আপনি অ্যারেটির আকার আগেই জানেন তাই আপনি ও (1) এর গ্যারান্টি দিতে পারেন। তারপরে আপনি কত অতিরিক্ত মেমরি ব্যবহার করেন তার তুলনায় আপনি সংঘর্ষগুলি বাণিজ্য করতে পারেন।
ভাইটালি

আপনি সেই ডাউনভোটটি পুনর্বিবেচনা করতে চাইতে পারেন - সমস্যার নতুন পোস্ট করা শর্তাদি জেফ বি এর সমাধানটিকে অবৈধ করে তুলেছে।
মার্ক র্যানসম

4
আপনি "ট্র্যাভারসাল" সম্পর্কে বিস্তারিত বলতে চাইতে পারেন, যেহেতু একটি নিরীহ ক্ষয় পদ্ধতিটি বিপুল সংখ্যক নকলের জন্য O (n ^ 2) এর ফলস্বরূপ হতে পারে।
মার্ক রান্সম

11

1. ও (1) অতিরিক্ত স্থান, ও (এন লগ এন) সময় ব্যবহার করে

এটি সম্ভব, উদাহরণস্বরূপ:

  • প্রথমে একটি ইন-প্লেস ও (এন লগ এন) বাছাই করুন
  • তারপরে তালিকার শুরুতে প্রতিটি পিঠের প্রথম উদাহরণটি লিখে একবারে তালিকাটি চলুন

আমি বিশ্বাস করি যে ইজেলের অংশীদারটি সঠিক যে এটি করার সর্বোত্তম উপায় হ'ল সরল একীভূতকরণের পদক্ষেপের সাথে একটি স্থান-সংযুক্তি সংযোজন এবং এটি যদি আপনি উদয় হন তবে সম্ভবত প্রশ্নটির উদ্দেশ্য nt ইনপুটগুলি উন্নত করার ক্ষমতা না রেখে এটি যথাসম্ভব দক্ষতার সাথে করার জন্য একটি নতুন লাইব্রেরির ফাংশন রচনা করা, এবং ইনপুটগুলির ধরণের উপর নির্ভর করে হ্যাশ-টেবিল ছাড়া এটি করা কার্যকর হবে cases তবে আমি আসলে এটি পরীক্ষা করে দেখিনি।

2. ও (প্রচুর) অতিরিক্ত স্থান, ও (এন) সময়ে ব্যবহার করা

  • সমস্ত পূর্ণসংখ্যা ধরে রাখতে যথেষ্ট বড় শূন্যের অ্যারে ঘোষণা করুন
  • অ্যারে দিয়ে একবার হাঁটুন
  • প্রতিটি পূর্ণসংখ্যার জন্য সংশ্লিষ্ট অ্যারে উপাদানকে 1 তে সেট করুন।
  • যদি এটি ইতিমধ্যে 1 হয় তবে পূর্ণসংখ্যাটি এড়িয়ে যান।

এটি কেবল তখনই কার্যকর হয় যদি বেশ কয়েকটি সন্দেহজনক ধারণা অনুমান করে:

  • সস্তার সাথে মেমরি শূন্য করা সম্ভব বা তাদের সংখ্যার তুলনায় ইনটসের আকার ছোট are
  • আপনি আপনার ওএসকে 256 ^ সিজেপফ (ইনট) মেমরির জন্য জিজ্ঞাসা করে খুশি
  • এবং এটি আপনার পক্ষে সত্যিই দক্ষতার সাথে এটি ক্যাশে দেবে যদি এটি বিশাল

এটি একটি খারাপ উত্তর, তবে আপনার কাছে যদি প্রচুর ইনপুট উপাদান থাকে তবে সেগুলি 8-বিট পূর্ণসংখ্যার (অথবা সম্ভবত 16-বিট পূর্ণসংখ্যার) হয় এটি সর্বোত্তম উপায় হতে পারে।

৩. ও (অল্প) -শক্তি অতিরিক্ত স্থান, ও (এন) - সময়

# 2 হিসাবে, তবে একটি হ্যাশ টেবিল ব্যবহার করুন।

4. পরিষ্কার উপায়

উপাদানগুলির সংখ্যা যদি কম হয়, তবে অন্য কোডটি দ্রুত লেখার জন্য এবং দ্রুত পড়ার জন্য উপযুক্ত অ্যালগরিদম লেখার পক্ষে দরকারী নয়।

যেমন প্রতিটি অভিন্ন উপাদান (যেমন প্রথম উপাদান, দ্বিতীয় উপাদান (প্রথমটির নকলগুলি সরানো হয়েছে ইত্যাদি) ইত্যাদির জন্য অ্যারের মধ্য দিয়ে চলুন all ও (1) অতিরিক্ত স্থান, হে (n ^ 2) সময়।

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


7

ভাল, এটি বেসিক বাস্তবায়ন বেশ সহজ। সমস্ত উপাদানগুলির মধ্যে যান, বাকীগুলিতে নকল রয়েছে কিনা তা পরীক্ষা করে দেখুন এবং তার উপরের অংশটি শিফট করুন।

এটি মারাত্মক অদক্ষ এবং আপনি আউটপুট বা বাছাই / বাইনারি গাছগুলির জন্য সহায়ক-অ্যারে দ্বারা এটি বাড়িয়ে দিতে পারেন তবে এটি অনুমোদিত হবে বলে মনে হয় না।


4
ওটিওএইচ, সর্টিং ট্রি বাস্তবায়নের জন্য প্রয়োজনীয় অতিরিক্ত কোড সাধারণ সমাধানের চেয়ে কম (মেমরি) দক্ষ হতে পারে এবং ছোট (100 টিরও কম উপাদান বলুন) অ্যারেগুলির জন্য রান-টাইমে সম্ভবত কম দক্ষ।
টিএমএন

6

যদি আপনাকে সি ++ ব্যবহার করার অনুমতি দেওয়া হয় তবে তার std::sortপরে একটি কল আপনাকে std::uniqueউত্তর দিবে। সময়ের জটিলতাটি বাছাইয়ের জন্য ও (এন লগ এন) এবং অনন্য ট্র্যাভারসালের জন্য ও (এন)।

এবং সি ++ যদি টেবিলের বাইরে থাকে তবে এমন কিছু নেই যা এই একই অ্যালগরিদমগুলিকে সি-তে লেখা থেকে রক্ষা করে keeps


"একটি সতর্কতা হ'ল প্রত্যাশিত অ্যালগরিদমের জন্য প্রথমে অ্যারে বাছাই করা উচিত নয়" "
এসবিআই

4
এটি বলে না যে আপনি একবার অ্যারে পেয়ে গেলে তা বাছাই করতে পারবেন না ... O (N) ব্যবহার না করেই ও (এন লগ এন) বা আরও ভাল করার একমাত্র উপায় O
গ্রেগ রজার্স 17

সমস্যার প্রয়োজনে স্ট্যান্ডার্ড লাইব্রেরির ব্যবহারগুলি ব্যবহার করা উচিত নয়। বাছাইয়ের বিষয়ে, তবে আমি যত বেশি এটি সম্পর্কে চিন্তা করি, ঠিক আছে কিনা তা আমি তত বেশি অনিশ্চিত।
ejel

4
আমি মনে করি সি ++ এবং সি ++ স্ট্যান্ডার্ড ফাংশনগুলিতে রেফারিং করা উত্তরগুলি দরকারী, এমনকি যদি তারা মূল প্রশ্নের উত্তর না দেয়, কারণ তারা এই প্রশ্নটি পরে খুঁজে পাওয়া লোকদের আরও গোলাকার উত্তর সরবরাহ করে।
ডগলাস লিডার 21

6

আপনি যদি স্মৃতির ত্যাগ করতে ইচ্ছুক হন তবে আপনি এটি একক ট্র্যাভার্সাল দিয়ে করতে পারেন। আপনি কোনও হ্যাশ / এসোসিয়েটিভ অ্যারেতে কোনও পূর্ণসংখ্যা দেখেছেন কিনা তা আপনি সহজেই টাল করতে পারেন। আপনি যদি ইতিমধ্যে একটি নম্বর দেখে থাকেন তবে এটি যাওয়ার সময় এটিকে সরিয়ে ফেলুন বা আরও ভাল, মূল অ্যারেটিতে কোনও স্থানান্তর এড়িয়ে আপনি নতুন অ্যারে তে দেখেন নি এমন নম্বরগুলি সরান।

পার্লে:


উত্তরটি মূল অ্যারেতে থাকতে হবে কিনা তা পরিষ্কার নয়।
ডগলাস লেডার

কোনও নতুন অ্যারের প্রয়োজন ছাড়াই এটি করতে, আপনি অ্যারের শেষে পপ্প করা কোনও উপাদান দিয়ে অনুলিপিটি সহজেই প্রতিস্থাপন করতে পারেন এবং বর্তমান লুপটি আবারও করতে পারেন, কারণ সমস্যাটি সেই আদেশের বিষয়টি নির্দিষ্ট করে না। এর জন্য কিছু অতিরিক্ত সীমানা পরীক্ষা করা দরকার তবে এটি খুব সক্ষম do
জেফ বি

6
প্রশ্নটি সম্পাদিত না হওয়া পর্যন্ত এটি একটি ভাল ধারণা ছিল। আপনার হ্যাশটেবল ধারণাটি স্পষ্টতই নিয়মের বিরুদ্ধে।
WCWedin

14
এই উত্তরটি কেন সবচেয়ে বেশি ভোট পেয়েছে তা আমি পাই না। এটি পার্লে লিখিত হয়েছে এবং গুরুত্বপূর্ণ জিজ্ঞাসা হিসাবে সিটিতে উপলভ্য নয় এমন বৈশিষ্ট্যগুলি ব্যবহার করে।
লীরাণুনা

4
প্রশ্নটি সি কোডের জন্য জিজ্ঞাসা করেছিল, পার্ল নয়। পার্ল ব্যবহারের ফলে আপনি হ্যাশ টেবিল পাবেন এবং বিনামূল্যে "পুশ" করুন। আমি যদি এটি স্কেলে করতে পারতাম তবে আপনি কেবল ইনপুটকে ফোন করতে পারবেন rem রিমুভ ডুপ্লিকেটস, তবে আমার সন্দেহ যে সাক্ষাত্কারকারীদের কাছে এটি গ্রহণযোগ্য হত :)
পিটার পুনরুদ্ধার করুন

5

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

বাইরের লুপের প্রতিটি পুনরাবৃত্তি অ্যারের একটি উপাদানকে প্রক্রিয়া করে। যদি এটি অনন্য হয় তবে এটি অ্যারের সামনের অংশে থেকে যায় এবং যদি এটি সদৃশ হয় তবে এটি অ্যারের শেষ অপসারণযুক্ত উপাদান দ্বারা ওভাররাইট করা হয়। এই সমাধানটি ও (এন ^ 2) সময়ে চলে।


4

এটি একটি জাভা সংস্করণ।


অন্তত পরবর্তী ইনপুটগুলির সাথে ব্যর্থ: {1,1,1,1,1,1,1 1} 0,0,0,0,0,1,1,1,1,1,1}
ইউরি

3

এখানে আমার সমাধান।


2

একটি অ্যারে স্পষ্টতই "ট্র্যাভার্সড" ডান থেকে বামে হওয়া উচিত মানগুলি পিছনে পিছনে অনুলিপি করা এড়াতে।

আপনার যদি সীমাহীন মেমরি থাকে তবে আপনি sizeof(type-of-element-in-array) / 8ইতিমধ্যে সংশ্লিষ্ট মানটির মুখোমুখি হয়েছেন কি না তা প্রতিটি বিটকে বোঝানোর জন্য আপনি কিছুটা অ্যারে বরাদ্দ করতে পারেন ।

যদি আপনি এটি না করেন তবে আমি কোনও অ্যারে ট্র্যাভার করা এবং প্রতিটি মানকে অনুসরণ করে আসা মানগুলির সাথে তুলনা করার চেয়ে ভাল কিছু ভাবতে পারি না এবং তারপরে যদি সদৃশ পাওয়া যায় তবে এই মানগুলি পুরোপুরি সরিয়ে ফেলুন। এটি O (n ^ 2) (বা ও ((n ^ 2-n) / 2) ) এর কাছাকাছি কোথাও ।

আইবিএম-এর কাছাকাছি বিষয় সম্পর্কিত একটি নিবন্ধ রয়েছে ।


প্রকৃতপক্ষে - বৃহত্তম উপাদান সন্ধান করার জন্য একটি ও (এন) পাস সামগ্রিক ও () ব্যয় বৃদ্ধি করবে না।
ডগলাস লেডার

2

দেখা যাক:

  • সর্বনিম্ন / সর্বাধিক বরাদ্দ সন্ধান করতে ও (এন) পাস করুন
  • বিট-অ্যারে পাওয়া গেছে
  • ও (এন) পাসের অদলবদলের ডুপ্লিকেট শেষ হবে।

প্রদত্ত যে তারা কেবলমাত্র পূর্ণসংখ্যার জন্য, সরলতার জন্য আপনি 32 বিট ধরে নিতে পারেন এবং ন্যূনতম / সর্বাধিক সন্ধান করতে বিরক্ত করবেন না: সুতরাং সীমানা সন্ধান করা কেবল একটি স্মৃতি-ব্যবহার এবং হে (1) সময়ের অপ্টিমাইজেশন (প্রদত্ত উদাহরণের ক্ষেত্রে মজাদার এক অপটিমাইজেশন)। এবং যদি তারা bit৪ বিটের হয় তবে এটি অপ্রাসঙ্গিক যেহেতু আপনি জানেন না যে আপনার কাছে থাকা মেমরির বিটের সংখ্যাটি ন্যূনতম এবং সর্বাধিক হবে না।
স্টিভ জেসপ

থিওরি একদিকে রেখে, 512MB বরাদ্দ করা কি ন্যূনতম / সর্বাধিক সন্ধানের চেয়ে বেশি সময় নেয় না?
লীরাউনা 21 ই

সেখানে কতটা ডেটা রয়েছে এবং মিনিট / ম্যাক্স কতটা নির্ভর করে। যদি আপনি 512MB এরও বেশি ইনপুটটি দেখছেন তবে সম্ভবত অতিরিক্ত অতিরিক্ত ও (এন) পাস এড়ানো আরও দ্রুত faster অবশ্যই আপনি যদি এত বেশি ইনপুটটি দেখছেন তবে আপনার কাছে 512 এমবি ছাড়ার সম্ভাবনা কম। এমন ক্ষেত্রে যেখানে সর্বনিম্ন / সর্বোচ্চটি 0 / INT_MAX এর কাছাকাছি থাকে, তবে অপ্টিমাইজেশানটিও কোনও সাহায্য করে না। আমি কেবল বলছি যে যদিও প্রথম পদক্ষেপটি স্পষ্টতই অল্প সংখ্যক জন্য সহায়তা করে, এটি এড়ানো যায় না যে এই অ্যালগরিদমটি সবচেয়ে খারাপ ক্ষেত্রে UINT_MAX বিট ব্যবহার করে, সুতরাং আপনাকে সেই সীমাবদ্ধতার জন্য পরিকল্পনা করা দরকার।
স্টিভ জেসোপ

আপনি ভাল হতে পারেন - যে কোনও ক্ষেত্রে প্রশ্নের স্পষ্টকরণের অর্থ হ'ল বিট-অ্যারে ব্যবহার করা বাইরে। কোনও উত্তর পরে বাধা ছাড়াই যদি কেউ আসে এবং সমস্ত সম্ভাব্য উত্তর দেখতে চায় তবে আমি এই উত্তরটি ছেড়ে দেব।
ডগলাস লিডার 21

2

এটি একটি পাসে একটি ও (এন লগ এন) অ্যালগরিদম এবং কোনও অতিরিক্ত স্টোরেজ সহ করা যায়।

উপাদান থেকে এগিয়ে a[1]যান a[N]। প্রতিটি পর্যায়ে i, বাম a[i]দিকে সমস্ত উপাদান উপাদানগুলির a[0]মাধ্যমে একটি সাজানো গাদা থাকে a[j]। ইতিমধ্যে, দ্বিতীয় সূচক j, প্রাথমিকভাবে 0, গাদা আকারের উপর নজর রাখে।

পরীক্ষা a[i]এবং গাদা, যা এখন উপাদানের দখল মধ্যে এটি সন্নিবেশ a[0]করতে a[j+1]। উপাদানটি সন্নিবেশ করানোর সাথে সাথে, যদি কোনও সদৃশ উপাদানটির a[k]একই মান রয়েছে, a[i]তবে গাদাতে ,োকানো হবে না (অর্থাত্, এটি বাতিল করুন); অন্যথায় গাদা, যা এখন এক উপাদান দ্বারা বৃদ্ধি মধ্যে এটি সন্নিবেশ এবং এখন গঠিত a[0]করার a[j+1], এবং বৃদ্ধি j

এই পদ্ধতিতে চালিয়ে যান, বৃদ্ধিশীল iপর্যন্ত অ্যারে উপাদানের সব পরীক্ষা করা হয়েছে এবং গাদা, যা অধিষ্ঠিত শেষ পর্যন্ত ঢোকানো a[0]করতে a[j]jহিপের শেষ উপাদানটির সূচক এবং হিপটিতে কেবল অনন্য উপাদান মান থাকে।

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


1

জাভাতে আমি এটি এর মতো সমাধান করব। সি তে এটি কীভাবে লিখতে হয় তা জানেন না


আপনি যদি ডুপ্লিকেটগুলি ওভাররাইট করে অ্যারের শেষে মান সহ সন্ধান করেন তবে আপনি () লুপের জন্য আপনার অভ্যন্তরে পুরো অ্যারের স্থানান্তর এড়াতে পারবেন। এটি আপনাকে ও (এন ^ 3) থেকে ও (এন ^ 3) এনে দেবে। আমার সি বাস্তবায়ন এখানে কোথাও ভাসছে ...
mocj

আমি ভেবেছিলাম, স্থানান্তর করা প্রয়োজনের অংশ ছিল, তবে আপনি অবশ্যই ঠিক আছেন।
ডোমিনিক

4
@ মোকজ: আমি আপনার সমাধানটি পছন্দ করি, দেখতে খুব মার্জিত লাগে। তবে আমি মনে করি শেষ দুটি উপাদান সমান হলে এটি কাজ করে না, কারণ আপনি শেষের আগে সাম্যের জন্য পরীক্ষা করা বন্ধ করে দিয়েছেন। (এখানে আসা কারণ এখানে অন্য কোথাও মন্তব্য করার জন্য খুব খ্যাতি রয়েছে :()
ডোমিনিক

মূল সমস্যাটি বাদ দিয়ে আপনি ঠিক বলেছেন যে অ্যারের শেষে থাকা মানগুলি নগন্য নয়। যেহেতু আপনি সংশোধিত অ্যারের দৈর্ঘ্যটি ফিরিয়ে দিচ্ছেন না যখন দুটি মান সমান হয় তখন শেষ মানের এবং দ্বিতীয় থেকে শেষের মধ্যে পার্থক্য গুরুত্বহীন। কলার ফিরে আসা অ্যারের সমাপ্তি কোথায় হবে তা ব্যাখ্যা করে
mocj

1

নিম্নলিখিত সম্পর্কে কীভাবে?

আমি একটি অস্থায়ী অ্যারে ঘোষণা করার চেষ্টা করি এবং সমস্ত উপাদানকে মূল অ্যারেতে অনুলিপি করার আগে উপাদানগুলিকে এতে .োকাতে পারি।


1

সমস্যাটি পর্যালোচনা করার পরে, এখানে আমার ডেলফি উপায়, এটি সাহায্য করতে পারে


1

নিম্নলিখিত উদাহরণটি আপনার সমস্যার সমাধান করা উচিত:


1

অ্যারের [i + 1] শেষ উপাদানটির জন্য অ্যারেআইন্ডেক্সআউটআউটবাউন্ডসেক্সশনটি ফেলে দেওয়া উচিত?
সাতেশ

"সাথেশ নং" <অরআর দৈর্ঘ্য -১ "এর কারণে
গ্যাব্রিয়েলবিবি

1

এটি নিষ্পাপ (এন * (এন -1) / 2) সমাধান। এটি ধ্রুবক অতিরিক্ত স্থান ব্যবহার করে এবং মূল ক্রম বজায় রাখে। এটি @ বাইজু দ্বারা সমাধানের মতো, তবে কোনও if(){}ব্লক ব্যবহার করে না । এটি নিজের উপর কোনও উপাদান অনুলিপি করা এড়িয়ে যায়।


0

এটি ইনপুট তালিকার পূর্ণসংখ্যার সংখ্যার ক্ষেত্রে ও (এন) সময়ে এবং একক পাসে অনন্য পূর্ণসংখ্যার সংখ্যায় ও (এন) স্টোরেজ করা যেতে পারে।

"ডিস্ট" এবং "এসসিআর" দুটি আইটেমটি প্রথম আইটেমটির সাথে শুরু করে সামনে থেকে পিছনে তালিকার মধ্য দিয়ে যান। "পূর্ণসংখ্যার দেখা" এর খালি হ্যাশ টেবিল দিয়ে শুরু করুন। যদি এসআরসি-তে পূর্ণসংখ্যা হ্যাশটিতে উপস্থিত না থাকে, তবে এটি ডিএসটি এবং বর্ধিত ডিএসটিতে স্লটে লিখুন। এসআরসি-তে পূর্ণসংখ্যার সাথে হ্যাশ যুক্ত করুন, তারপরে এনক্রিমেন্ট এসসিআর করুন। এসসিআর ইনপুট তালিকার শেষ না হওয়া পর্যন্ত পুনরাবৃত্তি করুন।


4
মূল প্রশ্নে সংশোধন করার সময়, হ্যাশ টেবিলগুলি অনুমোদিত নয়। আপনার দুটি পয়েন্টার পদ্ধতির মাধ্যমে ডুপ্লিকেটগুলি শনাক্ত করার পরে আউটপুটটি কমপ্যাক্ট করার একটি দুর্দান্ত উপায়।
মার্ক র্যানসম

0

একটি binary tree the disregards duplicates- তে সমস্ত উপাদান sertোকান O(nlog(n))। তারপরে ট্র্যাভারসাল করে সমস্তটি আবার অ্যারেতে বের করুন O(n)। আমি ধরে নিচ্ছি যে আপনার অর্ডার সংরক্ষণের দরকার নেই।


0

হ্যাশিংয়ের জন্য ব্লুম ফিল্টার ব্যবহার করুন। এটি মেমরির ওভারহেডকে খুব উল্লেখযোগ্যভাবে হ্রাস করবে।


বিশদ বিবরণ বা একটি রেফারেন্স সরবরাহ যত্ন?
dldnh

0

জাভাতে,

আউটপুট: {1, 2, 3, 4, 6, 7, 8, 9, 10}

আশা করি এটি সাহায্য করবে


4
ইনপুট দিয়ে এটি পরীক্ষা করুনarrayInteger = {100,10,1};
ব্লাস্টফারনেস


0

প্রথমে, আপনার এমন একটি অ্যারে তৈরি করা উচিত check[n]যেখানে এনটি নকল মুক্ত করতে চান এমন অ্যারের উপাদানগুলির সংখ্যা এবং প্রতিটি উপাদান (চেক অ্যারের) সমান 1 নির্ধারণ করতে চান। লুপের জন্য একটি অ্যারে ব্যবহার করে অ্যারেটি অ্যারো করে ফেলুন সদৃশ, এটির নামটি বলুন arrএবং ফোর-লুপে এটি লিখুন:

এটির সাথে আপনি প্রতিটি নকল শূন্যের সমান করে রেখেছেন। সুতরাং কেবলমাত্র কাজটি বাকি থাকে arrঅ্যারেটিকে অতিক্রম করা এবং এটি শূন্যের সমান নয় এমন সমস্ত কিছু মুদ্রণ করা। অর্ডার স্থির থাকে এবং এটি রৈখিক সময় নেয় (3 * এন)।


প্রশ্নটি অতিরিক্ত ডেটা কাঠামো ব্যবহার করার অনুমতি দেয় না।
ejel

0

এন উপাদানগুলির একটি অ্যারে দেওয়া, সময়যুক্ত অ্যারে থেকে সমস্ত সদৃশ অপসারণ করতে একটি অ্যালগরিদম লিখুন O (nlogn)

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


সমস্ত সাহসী গ্লাইফগুলির জন্য, আপনি কী তৈরি করেছেন helper data structure (e.g. hashtable) should not be used?
গ্রাইবার্ড

অগত্যা প্রয়োজন হয় না। আমি কেবল বোঝার উদ্দেশ্যে তাদের হাইলাইট করেছি।
শরিফ মুজাম্মিল

0

এটিই আমি পেয়েছি, যদিও এটি ঠিক করার জন্য আরোহণ বা উতরাই বাছাই করা ক্রমটি ভুলভাবে আবিষ্কার করে।


-1

আপনার যদি একটি ভাল ডেটা স্ট্রাকচার থাকে তবে এটিতে কোনও পূর্ণসংখ্যা রয়েছে কিনা তা তাড়াতাড়ি বলতে পারত এটি দুর্দান্ত। সম্ভবত কোনও ধরণের গাছ।

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