কার্যকরী ভাষায় পছন্দের ডেটা স্ট্রাকচারের তালিকা কেন দেওয়া হয়?


45

বেশিরভাগ কার্যক্ষম ভাষা লিংকযুক্ত তালিকাগুলি তাদের প্রাথমিক অপরিবর্তনীয় ডেটা কাঠামো হিসাবে ব্যবহার করে। কেন তালিকাগুলি, এবং যেমন গাছ না? গাছগুলি পাথ এবং এমনকি মডেলের তালিকাগুলি পুনরায় ব্যবহার করতে পারে।



10
@ জাগান - এটি এই প্রশ্নের সদৃশ নয় । এই প্রশ্নের গ্রহণযোগ্য এবং সঠিক উত্তরটি মূলত "কারণ একটি অপরিবর্তনীয় লিঙ্কযুক্ত তালিকাগুলি আপডেট এবং মূল তালিকার মধ্যে লেজ ভাগ করে নিতে দেয়", এই প্রশ্নের পটভূমির অংশ হিসাবে চিহ্নিত একটি উত্তর ...
জুলাই

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

আমি স্কেল ভেক্টরকে (যা একটি গাছ হিসাবে প্রয়োগ করা হয়) তালিকা স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 28৯২২২327 / এ কিছুটা পছন্দ করা হয় বাস্তবে বেশিরভাগ লোক এখনও তালিকাগুলি ব্যবহার করেন (যা আমি দেখেছি) থেকে from
আকাওয়াল

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

উত্তর:


56

কারণ তালিকাগুলি গাছের চেয়ে সহজ। (আপনি এটিকে তুচ্ছভাবে দেখতে পাচ্ছেন যে একটি তালিকা হ্রাসপ্রাপ্ত গাছ, যেখানে প্রতিটি নোডের একটিমাত্র শিশু থাকে))

কনস তালিকাটি স্বেচ্ছাসেবী আকারের সহজতম পুনরাবৃত্ত ডেটা কাঠামো।

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

উল্লেখ্য যে ক্লোজুরে, যার ডেটা স্ট্রাকচারগুলি বিশেষত সমান্তরাল, বিতরণ, "মেঘলা" বিশ্বের জন্য ডিজাইন করা হয়েছিল , এমনকি অ্যারে (ক্লোজারে ভেক্টর নামে পরিচিত), সম্ভবত এগুলির সমস্ত "লিনিয়ার" ডেটা কাঠামো বাস্তবে রূপায়িত হয়েছে গাছ।

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


10
হ্যাঁ, ক্লোজার ভেক্টরগুলি গাছ হিসাবে প্রয়োগ করা হয়েছে it তবে এটি লক্ষ্য করা যায় যে সেগুলি হ্যাশ অ্যারে ম্যাপযুক্ত চেষ্টা , আপনার মানক বাইনারি নয় data Tree a = Leaf a | Branch a (Tree a) (Tree a)। এটি আপনার "সরলতা" যুক্তিটিকে শক্তিশালী করে।
wchargin

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

1
pmapক্লোজুরে একটি ভেক্টরের উপর যেমন পিং এখনও ক্রমান্বয়ে প্রতিটি উপাদান অ্যাক্সেস করে; ভেক্টরের গাছের কাঠামো সাধারণত শেষ ব্যবহারকারী থেকে লুকানো থাকে।
Badcook

5

আসলে, ঐ তালিকা আছে গাছ! আপনার দুটি ক্ষেত্র সহ নোড রয়েছে carএবং এর cdrমধ্যে আরও বেশি নোড বা পাতা থাকতে পারে। শুধু তালিকার মধ্যে যারা গাছ করে তোলে, কনভেনশন হয় ব্যাখ্যাcdr একটি রৈখিক তালিকায় পরবর্তী নোডের একটি লিঙ্ক, এবং লিঙ্কটি carবর্তমান নোডের মান হিসাবে লিঙ্ক।

এটি বলেছিল, আমি অনুমান করি যে কার্যকরী প্রোগ্রামিংয়ে লিঙ্কযুক্ত তালিকার প্রসারটি পুনরাবৃত্তির উপরে পুনরাবৃত্তির প্রসারের সাথে যুক্ত। যখন আপনার একমাত্র লুপিং নির্মাণটি (পুচ্ছ) পুনরাবৃত্তি হয়, আপনি যে ডেটা স্ট্রাকচারগুলি এটির সাথে সহজেই ব্যবহার করতে চান তা চান; এবং লিঙ্কযুক্ত তালিকাগুলি তার জন্য উপযুক্ত।


5
যে ভাষার উপর নির্ভর করে। অবশ্যই, আপনি কনস সেলগুলি ব্যবহার করে LISP- পছন্দগুলিতে একটি গাছ বাস্তবায়ন করতে পারেন, তবে হাস্কেলের মধ্যে, উদাহরণস্বরূপ, আপনার সম্পূর্ণ আলাদা কাঠামো দরকার। এবং এটিও লক্ষ করুন যে বেশিরভাগ কার্যকরী ভাষাগুলিতে লেজ পুনরাবৃত্তির তুলনায় অনেক বেশি লুপিং গঠন রয়েছে। উদাহরণস্বরূপ, হ্যাস্কেল কোর লাইব্রেরিগুলি ভাঁজ (বাম এবং ডান), স্ক্যানগুলি, গাছের উপরে ট্র্যাভারসালগুলি, কী এবং মানচিত্রের মানগুলির উপর পুনরাবৃত্তি এবং আরও অনেক বিশেষজ্ঞ স্ট্রাকচার সরবরাহ করে। অবশ্যই, তারা পর্দার পিছনে পুনরাবৃত্তি সঙ্গে বাস্তবায়ন করা হয়েছে, কিন্তু ব্যবহারকারীর তাদের কাজ করার জন্য এটি সম্পর্কে ভাবার দরকারও নেই।
জুলাই 15

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

2
@ মাস্টার যখন হাস্কেল তার চেয়ে কম বয়সী তখনও এটি ২ old বছর বয়সী এবং অনেকগুলি ভাষাকে প্রভাবিত করেছেন (পাইথন, জাভা এবং সি # সহ কয়েকটি প্রভাবশালী নাম দেওয়ার জন্য)। এলআইএসপি দ্বারা ফাংশনাল প্রোগ্রামিং বিচার করা ALGOL দ্বারা অপরিহার্য প্রোগ্রামিংয়ের বিচার করার মতো - দু'টিই অজানা হওয়ার চেয়ে দীর্ঘ পথ অবলম্বন করে। ঠিক আছে. লিস্প তর্কসাপেক্ষভাবে এখনও প্রাসঙ্গিক তবে আমি এটিকে 'মূলধারার' হিসাবে বিবেচনা করব না এবং এমএল প্রকারগুলি সহ অনেক পরে অন্তর্দৃষ্টি মিস করি।
ম্যাকিয়েজ পাইচোটকা

1
আপনি যদি পুরো গাছটি স্পর্শ করতে চান তবে আপনি স্পষ্ট স্ট্যাক ব্যতীত এককভাবে সংযুক্ত গাছের লেজগুলি পুনরাবৃত্তভাবে বা পুনরাবৃত্তভাবে প্রক্রিয়াজাত করতে পারবেন না, তাই আমি মনে করি না যে লেজ পুনরাবৃত্তিটির কোনও যোগসূত্র রয়েছে।
k_g

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