অবিচ্ছিন্ন মেমরির সাথে আপনি রৈখিক সময়ে স্ট্রিংয়ে সমস্ত ভারসাম্যহীন পেরেনগুলি কীভাবে খুঁজে পাবেন?


11

একটি সাক্ষাত্কারের সময় আমাকে নিম্নলিখিত সমস্যাটি দেওয়া হয়েছিল:

স্ট্রিং দেয় যা প্যারেনের কিছু সংমিশ্রণ (বন্ধনী বা ব্রেসেস নয় - কেবল প্যারেন নয়) সহ অন্যান্য বর্ণানুক্রমিক অক্ষরের সাথে এমন সমস্ত প্যারেনকে সনাক্ত করে যার কোনও মিল নেই n

উদাহরণস্বরূপ, স্ট্রিং ") (আব))" তে সূচকগুলিতে 0 এবং 5 তে কোনও প্যারেন থাকে যা কোনও মিল নেই pare

আমি ও (এন) মেমরি ব্যবহার করে একটি স্ট্যাকের ও (এন) সমাধানটি এগিয়ে রেখেছি, স্ট্যাক ব্যবহার করে এবং স্ট্রিংয়ের মধ্য দিয়ে একবার প্যারেন্সকে স্ট্যাকের সাথে যুক্ত করেছি এবং যখনই আমি একটি বন্ধ প্যারেনের সাথে উপস্থিত থাকি এবং স্ট্যাকের শীর্ষে উপস্থিত থাকি একটি উদ্বোধনী পেরেন।

এরপরে, সাক্ষাত্কারকারীর দ্বারা উল্লেখ করা হয়েছিল যে স্থির মেমরির সাথে লিনিয়ার সময়ে সমস্যাটি সমাধান করা যেতে পারে (যেমনটি ইনপুট কী গ্রহণ করেছে তা ছাড়া অতিরিক্ত মেমরির ব্যবহার নেই))

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

তার পরামর্শের সমাধানটি কি কেউ পরিষ্কার করতে পারবেন?


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

আমি বলব এটি আপনার পক্ষে কিছু যায় আসে না। বাকী ভারসাম্য রেখে যাওয়া কোনও সেট সরান।
অস্থায়ী_ ব্যবহারকারী_র নাম

5
তারপরে সেগুলি সরিয়ে ফেলুন; পি
ভিড্রাক

@ উইড্রাক, অবশ্যই (আপনি জানেন) পোস্টারটি "কোনও ন্যূনতম সেট সরান ... " এর মধ্যে 'ন্যূনতম' শব্দটি ভুলে গিয়েছিল ।
এলস্পাইস

আমি প্রতি সেটিকে "এটি ভুলে যাইনি", বরং এটি ছেড়ে দিয়েছি কারণ এটি আমার কাছে একটি গুরুত্বপূর্ণ স্পেসিফিকেশন বলে মনে হয় না কারণ কেবলমাত্র একটি সেট রয়েছে যা এটিকে ভারসাম্যযুক্ত করতে অপসারণ করা যেতে পারে, "সমস্ত কিছু" ছাড়াও অবশ্যই অনুশীলনের উদ্দেশ্যকে পরাস্ত করা।
অস্থায়ী_ ব্যবহারকারী_নাম

উত্তর:


17

O(1)Θ(log(n))n

আপনি যে অ্যালগরিদম ব্যবহার করেছিলেন তার মূল নীতিটি রাখতে পারেন। আপনি মেমরি অপ্টিমাইজেশনের জন্য একটি সুযোগ মিস করেছেন।

স্ট্যাক ব্যবহার করে এবং স্ট্রিংয়ের মধ্য দিয়ে একবার প্যাকেজগুলি স্ট্যাকের সাথে যুক্ত করা এবং যখনই আমি একটি বন্ধ প্যারেনের মুখোমুখি হই এবং স্ট্যাকের শীর্ষে একটি খোলার পেরেন থাকে

তাহলে এই স্ট্যাকটি কী ধারণ করে? এটি কখনই থাকবে না ()(একটি উদ্বোধনী প্রথম বন্ধনী যার পরে একটি বন্ধনী প্রথম বন্ধনী হয়), যেহেতু )প্রদর্শিত হবে আপনি টিপানোর (পরিবর্তে পপ করুন )। সুতরাং স্ট্যাকটি সর্বদা ফর্মের মধ্যে থাকে )…)(…(- বন্ধ বন্ধনীগুলির একগুচ্ছ যার পরে খোলা বন্ধনীগুলির একগুচ্ছ।

এটি উপস্থাপন করার জন্য আপনার স্ট্যাকের দরকার নেই। ক্লোজিং বন্ধনীর সংখ্যা এবং খোলার বন্ধনীগুলির সংখ্যা কেবল মনে রাখবেন।

আপনি যদি এই দুটি কাউন্টার ব্যবহার করে স্ট্রিং বাম থেকে ডানে প্রসেস করেন তবে আপনার শেষে যা মিলছে না তা মিলছে না বন্ধন বন্ধনের সংখ্যা এবং মিল না খোলার বন্ধনীগুলির সংখ্যা।

Θ(n)

সংক্ষেপে: স্ট্রিংটি বাম থেকে ডানে প্রক্রিয়া করুন। মেলে না খোলার প্রথম বন্ধনীর পাল্টা বজায় রাখা। যদি আপনি একটি খোলার প্রথম বন্ধনী দেখে থাকেন তবে কাউন্টারটি বাড়ান। যদি আপনি একটি বন্ধনী প্রথম বন্ধনী দেখতে পান এবং কাউন্টারটি ননজারো হয় তবে কাউন্টারটি হ্রাস করুন। যদি আপনি একটি বন্ধ হওয়া প্রথম বন্ধনী দেখতে পান এবং কাউন্টারটি শূন্য হয়, তবে বর্তমান সূচকে একটি মিল না পাওয়া বন্ধনী বন্ধনী হিসাবে আউটপুট দিন।

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

অনুশীলন 1: এটি একটি আনুষ্ঠানিক স্বরলিপিতে লিখুন (গণিত, সিউডোকোড বা আপনার পছন্দসই প্রোগ্রামিং ভাষা)।

অনুশীলন 2: নিজেকে বোঝান যে এটি অ্যাপাস জ্যাকের মতো একই অ্যালগরিদম , কেবল আলাদাভাবে ব্যাখ্যা করেছেন।


ওহ খুব ভাল গিলস, খুব ভালভাবে ব্যাখ্যা করা হয়েছে। আমি এখন পুরোপুরি বুঝতে। আমার এক প্রশ্নের উত্তর পেয়ে আমি আপনার কাছ থেকে বেশ কয়েক বছর পেরিয়েছি।
অস্থায়ী_ ব্যবহারকারী_নাম

"আপনি যদি শেষে মেলানো বন্ধনীগুলির অবস্থানগুলি প্রতিবেদন করতে চান তবে আপনাকে প্রতিটি প্রথম বন্ধনীর অবস্থান মনে রাখা দরকার।" বেশ না। লিনিয়ার সময় মানে একক পাস নয়। অমিল দিকের কোনও বন্ধনী সন্ধান করতে এবং তাদের চিহ্নিত করতে আপনি দ্বিতীয় পাস করতে পারেন।
মাকিং হাঁস

শেষ পদক্ষেপের জন্য, আপনাকে এটিকে বিপরীতে চালাতে হবে না, আপনি কেবল সর্বশেষ এন "" ("মিল না হিসাবে চিহ্নিত করতে পারেন
মাকিং হাঁস

1
পছন্দ করেছেন যেমন (()
orlp

যদিও আমি সত্যিই এই উত্তরটি পছন্দ করি, কিছু আমাকে এটি সম্পর্কে বিরক্ত করে চলেছে। এটি হ'ল "আমার একরকম অবস্থানটি মনে রাখা দরকার এবং আমার মনে হয় এটির সাথে আমার যে সমস্যাটি রয়েছে তা হ'ল: আপনি কীভাবে" বর্তমান সূচকটি আউটপুট "মেমোরি ব্যয় না করে (অথবা আপনার নির্দিষ্ট আউটপুটগুলি এমনভাবে গ্রাস করেন এমন কোনও নির্দিষ্ট প্রসঙ্গ) আপনার আউটপুট W-এর কোন ব্যাপার না)।
Edouard

8

যেহেতু আমরা কেবল সমস্ত বর্ণচিহ্নগুলি উপেক্ষা করতে পারি, তাই আমরা ধরে নেব স্ট্রিংয়ে এখন থেকে কেবলমাত্র প্রথম বন্ধনী রয়েছে। প্রশ্নে যেমন আছে, কেবলমাত্র এক ধরণের বন্ধনী, "()"।

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

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


strn

আরম্ভ করুন turning_point=0, maximum_count=0, count=0। নিম্নলিখিত iথেকে প্রতিটি 0করতে n-1

  1. যদি str[i] = ')', 1 যোগ করুন count; অন্যথায়, বিয়োগ 1।
  2. যদি count > maximum_count, সেট turning_point=iএবং maximum_count=count

এখন turning_pointটার্নিং পয়েন্টের সূচক।

পুনরায় সেট করুন maximum_count=0, count=0। নিম্নলিখিত iথেকে প্রতিটি 0করতে turning_point

  1. যদি str[i] = ')', 1 যোগ করুন count; অন্যথায়, বিয়োগ 1।
  2. যদি count > maximum_count, সেট maximum_count = countiভারসাম্যহীন বন্ধ হওয়া বন্ধনী সূচক হিসাবে আউটপুট ।

পুনরায় সেট করুন maximum_count=0, count=0। প্রত্যেকের জন্য iথেকে n-1থেকে turning_point+1নীচের দিকে নিচের কাজগুলো।

  1. যদি str[j] = '(', 1 যোগ করুন count; অন্যথায়, বিয়োগ 1।
  2. যদি count > maximum_count, সেট maximum_count = countiভারসাম্যহীন খোলার প্রথম বন্ধনী সূচক হিসাবে আউটপুট ।

O(n)O(1)O(u)u


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

পাইথনে কোড এখানে ।

বেশ কয়েকটি পরীক্ষার ফলাফল দেখতে কেবল "রান" টিপুন।


অনুশীলন ১. দেখান যে উপরের অ্যালগরিদম ন্যূনতম কার্ডিনালিটির সাথে এমন একটি বন্ধনী সেট করবে যাতে বাকী বন্ধনী সামঞ্জস্য হয় parent

সমস্যা 1. স্ট্রিংয়ে "() []" এর মতো দুটি ধরণের বন্ধনী থাকলে আমরা কি সেই ক্ষেত্রে অ্যালগরিদমকে সাধারণ করতে পারি? ইন্টারলিভিং কেস, "([)]" নতুন পরিস্থিতি কীভাবে সনাক্ত এবং চিকিত্সা করতে হবে তা আমাদের নির্ধারণ করতে হবে।


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

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

ভারসাম্যহীন খোলার প্রথম বন্ধনীর সন্ধান করা ভুল। অর্থাৎ যদি আপনার আরারটি "()) হয়, পি হয় 2 এবং পি + 1 টি অ্যারার সীমানার বাইরে পড়ে। কেবলমাত্র একটি ধারণা - ভারসাম্যহীন উদ্বোধনী বন্ধনীগুলি সন্ধান করতে আপনি আরসকে বিপরীত করতে পারেন এবং ভারসাম্যহীন বন্ধ হওয়া বন্ধনী (অবশ্যই বিপরীতে অভিযোজিত সূচকগুলি সহ) খুঁজে পেতে অ্যালগরিদমের অংশটি ব্যবহার করতে পারেন।
ওজরেনটাক্যালসেক্রজনারিক

p+1

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