ফাংশনাল প্রোগ্রামিংয়ে ডেটা স্ট্রাকচার


11

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

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

উত্তর:


14

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

এরকম কিছু হতে পারে:

(
  (a (b c)),
  (b (a c)),
  (c (a b d)),
  (d (c))
)

এই যেমন একটি গ্রাফ দিতে পারে:

একটি <-> খ <-> গ <-> ঘ
^ ^
| |
+ + --------- + +

আপনি অভিনবতা পেতে চাইলে আপনি এটিতে ওজন যোগ করতে পারেন:

(
  (a (b 1.0 c 2.0)),
  (b (a 1.0 c 1.0)),
  (c (a 1.3 b 7.2 d 10.5)),
  (d (c -10.5))
)

আপনিও এতে আগ্রহী হতে পারেন: সিএল-গ্রাফ ("লিস্প গ্রাফ কাঠামো" বাক্যাংশটি গুগল অনুসন্ধান করে পাওয়া গেছে)


4
এটি কিছুটা দেরি হয়ে গেছে, তবে আমি মনে করি আমার সতর্ক করা উচিত যে "বাকী সমস্ত কিছু [তালিকা] ভিত্তিক" "বিভ্রান্তিকর। কমন লিস্প, স্কিম এবং ক্লোজার সকলের ভেক্টর, মানচিত্র, স্ট্রিং পাশাপাশি স্ট্রাকচার / ক্লাস রয়েছে, তালিকার শীর্ষে নির্মিত নয়; এগুলি তৈরি করার জন্য আমরা যে কোডটি লিখি তা হ'ল একটি তালিকা eg
coredump

3

কার্যকরী ভাষা ডেটা স্ট্রাকচারের সাথে একইভাবে ডিল করে যেভাবে অ-কার্যকরী ভাষাগুলি করেন: প্রয়োগ থেকে ইন্টারফেসকে আলাদা করে, বিমূর্ত ডেটা প্রকার তৈরি করে।

আপনি লিস্পে বিমূর্ত ডেটা প্রকার তৈরি করতে পারেন। উদাহরণস্বরূপ, একটি গ্রাফের জন্য, আপনি কয়েকটি ফাংশন চান:

(define (get-vertices graph) ;; gets all the vertices from a graph
  ...)

(define (get-edges graph) ;; gets all the edges from a graph
  ...)

(define (get-weight vertex-from vertex-to) ;; get the weight of a specific vertex
  ...)

আপনি যখন কোনও গ্রাফটিতে সেই ইন্টারফেসটি তৈরি করে ফেলেন, আপনি প্রোগ্রামার দক্ষতা, নমনীয়তা এবং গণ্য দক্ষতার মতো বিষয়গুলিকে সম্ভবত অনুকূল করে অনেকগুলি বিভিন্ন উপায়ে প্রকৃত ডেটা স্ট্রাকচার প্রয়োগ করতে পারেন।

কীটি গ্রাফ ব্যবহার করে এমন কোডটি কেবল গ্রাফ ইন্টারফেস ব্যবহার করে এবং অন্তর্নিহিত বাস্তবায়ন অ্যাক্সেস করে না তা নিশ্চিত করা হয়। এটি ক্লায়েন্ট কোডটিকে আসল বাস্তবায়ন থেকে নিরবিচ্ছিন্ন হিসাবে সহজ রাখবে।


2

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

{
 :a {:b 3 :c 4} 
 :b {:a 1} 
 :c {}
}

নোড সহ একটি মানচিত্র উপস্থাপন করবে: a: b এবং: c। : একটি বিন্দুতে: বি 3 এর ওজন সহ: এবং সি এর ওজনের সাথে 4: বি বিন্দু: একটি 1 এর ওজন সহ: সি সি কোনও বিষয় নির্দেশ করে না।


1

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

(defclass tree ()
  ((node :accessor node :initarg :node)
   (children :accessor children :initarg :children)))

কোডে যদি আমার আক্ষরিক গাছের প্রয়োজন হয় তবে আমি সম্ভবত একটি make-treeফাংশনও সংজ্ঞায়িত করব যা আমার পছন্দের গাছটির একটি তালিকা উপস্থাপন করে গাছ গাছের বস্তুতে পরিণত করে।


-2

হাস্কেলের তালিকায় রয়েছে প্রাথমিক তথ্য কাঠামো এবং যদি আপনি আরও উন্নত ডেটা স্ট্রোকচার চান তবে আপনি প্রায়শই গাছের মতো পুনরাবৃত্ত স্ট্রোকচার ব্যবহার করেন যেমন নাল বা নোড এবং দুটি গাছ

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