কেন হাস্কেল এবং স্কিম একক-সংযুক্ত তালিকা ব্যবহার করে?


12

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


তালিকা নির্মাণকারী মূল তালিকাটি পরিবর্তন না করে এককভাবে সংযুক্ত তালিকার শুরুতে সন্নিবেশ করতে পারে। এটি কার্যকরী প্রোগ্রামিংয়ের জন্য গুরুত্বপূর্ণ। দ্বিগুণভাবে লিঙ্কযুক্ত তালিকায় বেশ কয়েকটি সংশোধন রয়েছে, যা খুব খাঁটি নয়।
tp1

3
এটি সম্পর্কে ভাবুন, আপনি কীভাবে দ্বিগুণ-সংযুক্ত অপরিবর্তনীয় তালিকা তৈরি করবেন? আপনার দরকার হবে nextপরবর্তী উপাদান এবং আগের উপাদান বিন্দু পয়েন্টার prevপূর্ববর্তী উপাদানে পরবর্তী উপাদান বিন্দু পয়েন্টার। যাইহোক, এই দুটি উপাদানগুলির মধ্যে একটির অপরটির আগে তৈরি করা হয়েছে, যার অর্থ those উপাদানগুলির মধ্যে একটির মধ্যে একটি পয়েন্টার থাকা দরকার যা কোনও অস্তিত্বের সাথে এখনও নির্দেশ করে নি! মনে রাখবেন, আপনি প্রথমে একটি উপাদান তৈরি করতে পারবেন না, তারপরে অন্যটি এবং তারপরে পয়েন্টার সেট করুন - সেগুলি পরিবর্তনযোগ্য are (দ্রষ্টব্য: আমি জানি একটি উপায় আছে, অলসতা কাজে লাগিয়ে "বেঁধে দেওয়া" বলে ডাকা হয়))
জার্গ ডব্লু মিতাগ

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

উত্তর:


23

ঠিক আছে, যদি আপনি কিছুটা গভীর থেকে দেখেন তবে উভয়ই মূল ভাষার মধ্যে অ্যারেগুলি অন্তর্ভুক্ত করে:

  • 5 তম সংশোধিত প্রকল্পের প্রতিবেদনে (আর 5আরএস) ভেক্টর প্রকার অন্তর্ভুক্ত রয়েছে যা এলোমেলো অ্যাক্সেসের জন্য লিনিয়ার সময়ের চেয়ে ভাল আকারের পূর্ণসংখ্যার-সূচকযুক্ত সংগ্রহ।
  • হাস্কেল 98 রিপোর্টে একটি অ্যারের ধরণও রয়েছে ।

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

প্রথমটি হ'ল একক-লিঙ্কযুক্ত তালিকাগুলি অন্যতম সহজ এবং তবুও সবচেয়ে দরকারী পুনরাবৃত্তির ডেটা ধরণের। হাস্কেলের তালিকার ধরণের একটি ব্যবহারকারী-সংজ্ঞায়িত সমতুল্য এই জাতীয় সংজ্ঞা দেওয়া যেতে পারে:

data List a           -- A list with element type `a`...
  = Empty             -- is either the empty list...
  | Cell a (List a)   -- or a pair with an `a` and the rest of the list. 

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

map :: (a -> b) -> List a -> List b
map f Empty = Empty
map f (Cell a as) = Cell (f a) (map f as)

filter :: (a -> Bool) -> List a -> List a
filter p Empty = Empty
filter p (Cell a as)
    | p a = Cell a (filter p as)
    | otherwise = filter p as

এই কৌশলটি গ্যারান্টি দেয় যে আপনার ফাংশনটি সমস্ত সীমাবদ্ধ তালিকার জন্য বন্ধ হয়ে যাবে, এবং সমস্যা সমাধানের একটি ভাল কৌশল is এটি প্রাকৃতিকভাবে সমস্যাগুলিকে আরও সহজ, আরও টেকনেবল উপ-বিভাগগুলিতে বিভক্ত করে।

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

দ্বিতীয় কারণটি "একক সংযুক্ত তালিকাগুলি কেন" কারণগুলির তুলনায় কম, তবে "ডাবল-লিঙ্কযুক্ত তালিকাগুলি বা অ্যারেগুলি কেন নয়" কারণগুলির মধ্যে আরও বেশি: কারণগুলির পরবর্তী তথ্যগুলি প্রায়শই মিউটেশন ( পরিবর্তিত পরিবর্তনশীল) ডাকে , যা প্রায়শই কার্যকরী প্রোগ্রামিং হয় থেকে দূরে shies। এটি যেমন ঘটে:

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

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

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

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

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

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

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


1
কি দুর্দান্ত উত্তর!
এলিয়ট গোরোকভস্কি

14

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

node -> node -> node -> empty
 1       2       3

node -> node -> node -> empty
 10       2       3

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

node -> node -> node -> empty
 1      ^ 2       3
        |
node ---+
 10

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

যাইহোক, যদি আপনি চেষ্টা করুন এবং প্রতিনিধিত্ব যদি [1, 2, 3]এবং [10, 2, 3]যেমন দোকর লিঙ্ক তালিকা:

node <-> node <-> node <-> empty
 1       2       3

node <-> node <-> node <-> empty
 10       2       3

এখন পুচ্ছগুলি আর অভিন্ন নয়। প্রথম [2, 3]একটি পয়েন্টার আছে 1মাথা, কিন্তু দ্বিতীয় একটি পয়েন্টার আছে 10। অতিরিক্তভাবে, আপনি যদি তালিকার শীর্ষে কোনও নতুন আইটেম যুক্ত করতে চান তবে আপনাকে তালিকার আগের মাথাটি নতুন মাথাতে ইঙ্গিত করতে হবে ate

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


8
যদিও আপনার ইঙ্গিতটি লেজ ভাগ করে নেওয়া হয় না। সাধারণত, কেউ সমস্ত তালিকায় মেমোরিতে যায় না এবং সাধারণ প্রত্যয়গুলিকে একীভূত করার সুযোগগুলি সন্ধান করে। শেয়ারিং শুধু ঘটবে কিভাবে এটি আলগোরিদিম লেখা হয় বাইরে পড়ে, যেমন যদি একটি প্যারামিটার সঙ্গে একটি ফাংশন xsনির্মান 1:xsএক জায়গায় এবং 10:xsঅন্য।

0

@ সাকুন্দিমের উত্তর বেশিরভাগ ক্ষেত্রেই সত্য, তবে ভাষার নকশা এবং ব্যবহারিক প্রয়োজনীয়তা সম্পর্কে বাণিজ্য সম্পর্কে আরও কিছু গুরুত্বপূর্ণ অন্তর্দৃষ্টি রয়েছে।

অবজেক্টস এবং রেফারেন্স

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

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

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

ডেটা স্ট্রাকচারের সিমুলেশন সমস্যা

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

তবে দ্বি দ্বি-সংযুক্ত তালিকার তুলনায় ভেক্টর / অ্যারে প্রকারের মধ্যে পার্থক্য রয়েছে। একটি অ্যারে প্রায়শই ও (1) অ্যাক্সেস সময় জটিলতা এবং কম স্থানের ওভারহেড দিয়ে ধরে নেওয়া হয়, যা তালিকার দ্বারা ভাগ না করা দুর্দান্ত বৈশিষ্ট্য। (যদিও কঠোরভাবে বলা যায়, আইএসও সি দ্বারা উভয়ই গ্যারান্টিযুক্ত নয়, তবে ব্যবহারকারীরা প্রায়শই এটির প্রত্যাশা করেন এবং কোনও ব্যবহারিক প্রয়োগ কার্যকরভাবে এই অন্তর্নিহিত গ্যারান্টি লঙ্ঘন করবে না)) ওটিওএইচ, একটি দ্বিগুণ সংযুক্ত তালিকা প্রায়শই উভয় সম্পত্তিকে এককভাবে সংযুক্ত তালিকার চেয়ে আরও খারাপ করে তোলে O , যখন পশ্চাদপদ / ফরোয়ার্ড পুনরাবৃত্তিটি এমনকি কম ওভারহেড সহ একটি অ্যারে বা ভেক্টর (পূর্ণসংখ্যার সূচকগুলির সাথে একত্রে) দ্বারা সমর্থিত হয়। সুতরাং, দ্বিগুণ-লিঙ্কযুক্ত তালিকাটি সাধারণভাবে আরও ভাল সম্পাদন করে না। আরও খারাপ এখনও, তালিকার গতিশীল মেমোরি বরাদ্দ সম্পর্কিত ক্যাশে দক্ষতা এবং বিলম্বিতা সম্পর্কে পারফরম্যান্স অন্তর্নিহিত বাস্তবায়ন পরিবেশের দ্বারা সরবরাহিত ডিফল্ট বরাদ্দকারী ব্যবহার করার সময় অ্যারে / ভেক্টরগুলির পারফরম্যান্সের চেয়ে বিপর্যয়করভাবে খারাপ। সুতরাং খুব নির্দিষ্ট এবং "চতুর" রানটাইম খুব বেশি এই জাতীয় বস্তু তৈরির অনুকূলিতকরণ ছাড়াই অ্যারে / ভেক্টর প্রকারগুলি প্রায়শই লিঙ্কযুক্ত তালিকাগুলিতে পছন্দ করা হয়। (উদাহরণস্বরূপ, আইএসও সি ++ ব্যবহার করে, একটি সতর্কতা রয়েছেstd::vectorstd::listডিফল্টরূপে অগ্রাধিকার দেওয়া উচিত )) সুতরাং, বিশেষভাবে সংযুক্ত তালিকার (দ্বিগুণ) লিঙ্কযুক্ত তালিকার পক্ষে নতুন আদিমদের পরিচয় করানো অবশ্যই অনুশীলনে অ্যারে / ভেক্টর ডেটা স্ট্রাকচারকে সমর্থন করার জন্য এতটা সুবিধাজনক নয়।

সুষ্ঠু হওয়ার জন্য, তালিকায় এখনও অ্যারে / ভেক্টরগুলির চেয়ে কিছু নির্দিষ্ট বৈশিষ্ট্য রয়েছে:

  • তালিকাগুলি নোড-ভিত্তিক। তালিকা থেকে উপাদানগুলি সরিয়ে ফেলা অন্য নোডের অন্যান্য উপাদানের রেফারেন্সকে অবৈধ করে না । (এটি কিছু গাছ বা গ্রাফের ডেটা কাঠামোর ক্ষেত্রেও সত্য)) ওটিওএইচ, অ্যারে / ভেক্টরগুলি অনুসরণযোগ্য অবস্থানটি অবৈধ হওয়ার বিষয়ে উল্লেখ করতে পারে (কিছু ক্ষেত্রে ব্যাপক পুনঃনির্ধারণের সাথে)।
  • তালিকাগুলি ও (1) সময়ে বিভক্ত হতে পারে । বর্তমানের সাথে নতুন অ্যারে / ভেক্টরগুলির পুনর্গঠন অনেক বেশি ব্যয়বহুল।

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

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

অপরিচ্ছন্নতা এবং এলিয়াসিং

হাস্কেলের মতো শুদ্ধ ভাষায়, বস্তুগুলি অপরিবর্তনীয়। স্কিমের অবজেক্টটি প্রায়শই কোনও রূপান্তর ছাড়াই ব্যবহৃত হয়। এ জাতীয় সত্যটি অবজেক্ট ইন্টার্নিংয়ের সাথে মেমরির দক্ষতার কার্যকরভাবে উন্নতি করা সম্ভব করে - উড়ে একই মান সহ একাধিক বস্তুর অন্তর্নিহিত ভাগ করে নেওয়া।

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

সাধারণ পরিকল্পনাযুক্ত প্রোগ্রামিংয়ের জন্য ভাষা নকশার এ জাতীয় পছন্দ সমস্যাযুক্ত হতে পারে। তবে কিছু সাধারণ কার্যকরী কোডিং নিদর্শনগুলির সাথে, ভাষাগুলি এখনও ভাল কাজ করে বলে মনে হচ্ছে।

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