শান্টিং-ইয়ার্ড অ্যালগরিদমে ফাংশনের নজির


10

উইকিপিডিয়া বর্ণিত শান্টিং-ইয়ার্ড অ্যালগরিদমের মাধ্যমে আমি কাজ করছি ।

অপারেটরদের সাথে ডিল করার সময় অ্যালগরিদমের বিবরণ নিম্নরূপ:

যদি টোকেনটি অপারেটর হয়, o1, তবে:

অপারেটর স্ট্যাকের শীর্ষে অপারেটর টোকেন, ও 2 থাকে এবং অন্যথায়

o1 is left-associative and its precedence is less than or equal to
that of o2, or

o1 is right associative, and has precedence less than that of o2,

তারপরে আউটপুট সারিতে অপারেটর স্ট্যাকের বাইরে o2 টিপুন;

অপারেটর স্ট্যাকের উপর o1 চাপুন।

তবে, তারা নিম্নলিখিত উদাহরণ দেয়:

ইনপুট: sin max 2 3 / 3 * 3.1415

যখন অ্যালগরিদম টোকেনটিকে আঘাত করে /, তখন কী ঘটবে সে সম্পর্কে বিবরণটি নিম্নরূপ:

Token |        Action       |   Output (in RPN) |   Operator Stack
...
/     | Pop token to output | 2 3 max           | / sin 
...

তারা ফাংশনটি টোকেনটি maxবন্ধ করে stackদিচ্ছে এবং এতে রাখছে queue। তাদের অ্যালগরিদম অনুসারে, এর অর্থ ফাংশন টোকেন উভয়ই অপারেটর এবং অপারেটরের চেয়ে তার প্রাধান্য কম বলে মনে হচ্ছে /

এটি কেস কিনা তা নিয়ে কোনও ব্যাখ্যা নেই। সুতরাং, Shunting-yardঅ্যালগরিদমের জন্য, কোন ফাংশনের নজিরটি কী? ডান বা বাম মিশ্রণমূলক ফাংশন হয়? অথবা উইকিপিডিয়া কি কেবল অসম্পূর্ণ / অসম্পূর্ণ?

উত্তর:


5

আমি বিশ্বাস করি প্রত্যক্ষ উত্তরটি কেবল এটি যে ফাংশনগুলি অপারেটর নয়। আপনি লিঙ্ক করা পৃষ্ঠা থেকে:

যদি টোকেনটি কোনও ফাংশন টোকেন হয় তবে এটি স্ট্যাকের উপরে চাপ দিন।

অপরিবর্তনের ক্ষেত্রে (ইনফিক্স থেকে পোস্টফিক্স) তুলনায় ফাংশন কেস (উপসর্গ থেকে পোস্টফিক্স) অনেক সহজ বলেই এটি বলা দরকার।

ফলো-আপ প্রশ্নের জন্য: একাধিক ইনফিক্স অপারেটরগুলির সাথে কোনও অভিব্যক্তিতে উত্তরাধিকারসূতী অস্পষ্টতার কারণে অগ্রাধিকার এবং সাহচর্যতার ধারণাগুলি প্রয়োজন। ফাংশন টোকেনগুলি ইতিমধ্যে প্রিফিক্স স্বরলিপি ব্যবহার করছে, সুতরাং তাদের কেবল এই সমস্যাটি নেই। আপনাকে জানতে হবে না, সেই sinবা max"উচ্চতর প্রাধান্য" জিনিসটা যে হয়েছে maxচাহিদা প্রথম মূল্যায়ন হবে; এটি টোকেনের ক্রম থেকে ইতিমধ্যে পরিষ্কার। এজন্য কম্পিউটারগুলি প্রি / পোস্টফিক্স সূচনাটি শুরু করতে পছন্দ করে এবং ইনফিক্সকে প্রাক / পোস্টফিক্সে রূপান্তর করার জন্য কেন আমাদের এই অ্যালগরিদম রয়েছে।

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


তাদের অ্যালগরিদম ঠিক আছে, তবে; এটি তাদের উদাহরণ যা ভুল। ইনফিক্স শিরোনামের মধ্যে ফাংশনগুলিকে মোড়ানো প্রথম বন্ধনী অন্তর্ভুক্ত করা উচিত:sin( max( 2 3) / 3 * 3.1415)
মিররফেট

আমি এটিকে ভুল বলছি কিনা তা নিশ্চিত নই, তবে ভাষার পক্ষে এটি একটি শক্ত যুক্তি যার জন্য সমস্ত ফাংশন কলের চারপাশে বন্ধনী এবং কমা প্রয়োজন।
Ixrec

আমি মনে করি এটি ভুল হিসাবে তারা ইনফিক্সকে অ্যালগরিদমটি বর্ণনা করে যেমন পার্স করা অসম্ভব।
মিররফেটে

@Ixrec আমি লাইনটি দেখতে পাচ্ছি না "যদি টোকেনটি কোনও ফাংশন টোকেন হয় তবে এটি স্ট্যাকের উপর চাপ দিন।" উইকিপিডিয়া পৃষ্ঠায়। এটি এখনই সম্পাদিত হতে পারে। তবে আপনার অর্থ কি আমি কোনও ফাংশনটি অ্যালগরিদমের সংখ্যার মতোই আচরণ করতে পারি?
অভিনব

আমি বিশ্বাস করি, উইকিপিডিয়া নিবন্ধে (আজ অবধি) অ্যালগরিদম বিবরণে একটি ত্রুটি রয়েছে। বাক্যাংশের পরে if there is a left parenthesis at the top of the operator stack, then: pop the operator from the operator stack and discard it, অন্য একটি লাইন যুক্ত করা উচিত: এখন যদি স্ট্যাকের শীর্ষে কোনও ফাংশনের নাম থাকে, তবে এটি স্ট্যাক থেকে পপ করুন এবং আউটপুটটিতে ধাক্কা দিন । অন্য কথায়, বাম '(' সবসময় ফাংশনটির নামের সাথে পপ করা উচিত, যদি ফাংশন সিনট্যাক্সের দ্বারা এগুলি একসাথে রাখা হয়: " name("।
স্ট্যান

3

আপনার ভাষার সিনট্যাক্সের উপর নির্ভর করে দুটি আলাদা কেস বিবেচনা করতে হবে। যদি আপনার ভাষা ফাংশন অ্যাপ্লিকেশন (উদাহরণস্বরূপ f(2+1)) নির্দেশ করতে প্যারেনেসিস ব্যবহার করে তবে অগ্রাধিকার অপ্রাসঙ্গিক। ফাংশনটি স্ট্যাকের দিকে ঠেলাঠেলি করা উচিত এবং পরে পপ আউট করা উচিত (উপরের উদাহরণস্বরূপ, ফলাফলটি 2 1 + f)। বিকল্পভাবে আপনি ফাংশনটিকে একটি মান হিসাবে অবিলম্বে বিবেচনা করতে পারেন এবং এটি অবিলম্বে আউটপুট করতে পারেন এবং নিকট বন্ধনীর পরে কোনও ফাংশন অনুরোধ অপারেশন আউটপুট করতে পারেন (যা অন্যথায় কোনও প্রথম বন্ধনী হিসাবে একই আচরণ করা উচিত), যেমন ফাংশন আহ্বান অপারেশনটি f 2 1 + $কোথায় $

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

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

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

আপনাকে কেবল তখন সিদ্ধান্ত নিতে হবে যা হ'ল ফাংশন আবেদনের নজির। পছন্দটি আপনার উপর নির্ভর করে, তবে প্রতিটি ভাষায় আমি এটি ব্যবহার করে যা এটি ব্যবহার করে, এটি ভাষায় সর্বাধিক দৃ b়ভাবে বাধ্যতামূলক অপারেটর হয়ে উঠেছে, এবং এটি সঠিকভাবে সহযোগী হয়েছে। (হাস্কেল হ'ল একমাত্র আকর্ষণীয় প্রকরণ, যার পাশাপাশি দৃ strongly়ভাবে বাঁধাই করা সংস্করণ বর্ণিত হয়েছে, এর চিহ্ন প্রতিশব্দও রয়েছে $যা ভাষার সবচেয়ে দুর্বলতম বাঁধাইকারী অপারেটর যা এক্সপ্রেশন f 2 + 12 থেকে 5 এ প্রয়োগ করতে এবং f $ 2 + 1প্রয়োগ করতে পছন্দ করে এটি বাকী বাকী অংশের পুরো অংশে)


3

আমি ডিজকস্ট্রার মূল চিন্তাভাবনা (আলগোলের comp০ সংকলক পত্রিকায় 7-১১ পৃষ্ঠা, https://ir.cwi.nl/pub/9251 ) পড়ার পরে এবং " একটি শক্ত সমাধানের প্রয়োজনের জন্য জিজ্ঞাসা করা" শান্টিং ইয়ার্ডে ফাংশনগুলির জন্য প্রয়োগ করেছি " , নিম্নলিখিতটি করেছেন:

পার্সিং:

  • ফাংশন বর্ণনাকারী পুশ করুন
  • তার সুব্যাক্স্রেশন প্যারেনেসিসের শুরু মতো "[" "আর্টস-এর-বাম বন্ধনী বন্ধ করুন P
  • ইনপুট থেকে একটি "(" থেকে ")" সুষম যুক্তি তালিকার ক্রমটি পড়ুন
  • আউটপুট টোকেন স্ট্রিম এ এটি পুশ করুন
  • একটি "শেষের বন্ধনী বন্ধনী" ঠিক তার মতো "একটি শেষ প্রান্তের ডান বন্ধনী" চাপুন

ইনফিক্স-টু-পোস্টফিক্স (শান্টিং ইয়ার্ড):

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

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

উদাহরণগুলি "স্কয়ার্ট (3 ^ 2 + 4 ^ 2)" এর মতো দেখতে লাগে যা "3 2 ^ 4 2 ^ + স্কুয়ার্ট" হয়ে যায় এবং শেষ পর্যন্ত "5" যা প্রোগ্রামটি মনে করে এটি আর্গুমেন্ট। এটি বিগন্যাম, সুতরাং "" দ্বিপদী (64, 32) / জিসিডি (দ্বিপদী (64, 32), দ্বিপদী (63, 31)) "==> বড় জিনিসগুলি ==>" 2 "সহায়ক।" 123456 ^ 789 " 40,173 ডিজিটের এবং সময়টি আমার ম্যাকবুকপ্রোতে "মূল্যায়ন = 0.000390 সেকেন্ড" দেখায়, তাই দ্রুত।

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

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