ক্লোজুরে, কখন আমাকে কোনও তালিকার উপরে এবং অন্য উপায়ে ভেক্টর ব্যবহার করা উচিত?


147

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


উত্তর:


112

আবারও, মনে হচ্ছে আমি অধৈর্য হয়ে নিজের প্রশ্নটির জবাব দিয়েছি এবং ফ্রেইনোডে # ক্লোজারে এটি জিজ্ঞাসা করেছি। আপনার নিজের প্রশ্নের উত্তর দেওয়ার ভাল জিনিস স্ট্যাকওভারফ্লো.কম এ উত্সাহিত হয়েছে: ডি

আমি রিচ হিকির সাথে একটি দ্রুত আলোচনা করেছি, এবং এটির সংক্ষেপে এখানে রয়েছে।

[12:21] <Raynes>    Vectors aren't seqs, right?
[12:21] <rhickey>   Raynes: no, but they are sequential
[12:21] <rhickey>   ,(sequential? [1 2 3])
[12:21] <clojurebot>    true
[12:22] <Raynes>    When would you want to use a list over a vector?
[12:22] <rhickey>   when generating code, when generating back-to-front
[12:23] <rhickey>   not too often in Clojure

আপনি যখন ফ্রেইনোডে থাকবেন তখন অন্ধকার দিকে এসে # স্ট্যাকওভারফ্লোতে যোগ দিন! :
ক্রিস জেস্টার-ইয়াং

আমি আসলে সেখানে অলস করতাম। আমি আইআরসি ক্লায়েন্টগুলিকে স্যুইচ করেছি এবং আমার অটোজাইন তালিকায় # স্টেকওভারফ্লো যুক্ত করার কথা ভাবি নি।
রায়নে

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

23
এটি সম্পূর্ণরূপে অপ্রয়োজনীয় চ্যাট স্নিপেট। "জেনারেটিং কোড" "ব্যাক-টু-ফ্রন্ট তৈরি করা" -> এর অর্থ হ'ল ?? আমার এই প্রশ্নটিতে সত্যিই সমস্যা হচ্ছে কারণ আমার বইতে আলস্যতা + ঘোষিত স্টাইল = আরও ভাল পারফরম্যান্স, এবং তবুও ক্লোজুরে যে কোনও জায়গায় ভেক্টরদের পরামর্শ দেওয়া হয়েছে যা আমাকে পুরোপুরি বিভ্রান্ত করে তোলে।
জিমি হোফা 20

22
@ জিমিহোফা যেভাবে আমি এটি বুঝতে পারি: "জেনারেটিং কোড" = "একটি ম্যাক্রোর ভিতরে" (কারণ বেশিরভাগ কোডটি ফাংশন কল, এইভাবে তালিকাভুক্ত হয়); "সামনের দিকে ফিরে উত্পন্ন করা হচ্ছে" = "প্রিপেন্ডিংয়ের মাধ্যমে ক্রম তৈরি করা"।
omeel

87

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

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

যাইহোক, ভেক্টরগুলি সহজেই সেকস-এ পরিণত হতে পারে।

user=> (def v (vector 1 2 3))
#'user/v
user=> v
[1 2 3]
user=> (seq v)
(1 2 3)
user=> (rseq v)
(3 2 1)

ভেক্টরগুলি সেকস নয়, তবে তারা অনুক্রমিক। (উত্স: ফ্রিণোডে # ক্লোজারে নিজেকে ধনী)
রায়েন

1
আমি আমার পোস্টটি এডিট করব এটি বলার জন্য, সেক্টর ফাংশনটির মাধ্যমে ভেক্টরগুলিকে সেকস তৈরি করা যেতে পারে । :-)
ক্রিস জেস্টার-ইয়াং

2
আপনার উত্তরটি চয়ন করুন কারণ এটি সত্যই প্রশ্নের উত্তর দিয়েছে এবং আমি সত্যই নিজের উত্তরগুলি সঠিক হিসাবে পছন্দ করতে পছন্দ করি না। ঠিক মনে হচ্ছে না। ধন্যবাদ। :)
রায়্ন

প্রথম এবং শেষ যোগ করার ক্ষেত্রে একটি লিঙ্কযুক্ত তালিকার চেয়ে একটি ডীক ভাল। এলএলগুলি বেশ ভয়ঙ্কর: পি
বক্স

1
@ বাক্সিত আপনি কোনও ভেক্টরের উপরে বা ArrayListকার্যকরভাবে, ArrayDequeনিজেকে পুনরায় সংশোধন করে কোনও ডেকিকে প্রয়োগ করতে পারবেন না ।
ক্রিস জেস্টার-ইয়াং

43

ভেক্টরগুলির ও (1) এলোমেলো অ্যাক্সেসের সময় রয়েছে তবে সেগুলি পূর্বনির্ধারিত হতে হবে। তালিকাগুলি ডায়নামিকভাবে বাড়ানো যেতে পারে তবে এলোমেলো উপাদান অ্যাক্সেস করা ও (এন)।


3
প্রযুক্তিগতভাবে, লিঙ্কযুক্ত তালিকায় ও (1) অ্যাক্সেসের সময় রয়েছে ... যদি আপনি কেবল সামনের বা পিছনের অংশে অ্যাক্সেস করেন। :-P তবে, ভেক্টরগুলির ও (1) এলোমেলো অ্যাক্সেস রয়েছে। :-)
ক্রিস জেস্টার-ইয়াং

4
(উপরে বর্ণিত "লিঙ্কযুক্ত তালিকা" দ্বিগুণ-সংযুক্ত তালিকাগুলি উল্লেখ করে Sing এককভাবে লিঙ্কযুক্ত তালিকায় ও (1) কেবল সামনের উপাদানটিতে অ্যাক্সেস রয়েছে: :
ক্রিস জেস্টার-ইয়ং

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

@ ক্রিসজেস্টার-ইয়াং সিঙ্গল-লিঙ্কযুক্ত তালিকার পেছনে ও (1) অ্যাক্সেসটিকে সমর্থন করতে পারে যদি এটি পিছনের উপাদানটির মতো কোনও রেফারেন্স সঞ্চয় করে
গিল বেটস

30

কখন ভেক্টর ব্যবহার করবেন:

  • সূচিযুক্ত অ্যাক্সেস কার্য সম্পাদন - তালিকার জন্য আপনি সূচীকরণ অ্যাক্সেসের জন্য ~ O (1) মূল্য পান ((এন)
  • সংযোজন - কনজ সহ ~ হে (1)
  • সুবিধাজনক স্বরলিপি - যে পরিস্থিতিতে কাজ করবে সে পরিস্থিতিতে আক্ষরিক তালিকার জন্য '(1 2 3)' র চেয়ে [1 2 3] টাইপ করা এবং পড়া উভয়ই সহজ find

একটি তালিকা কখন ব্যবহার করবেন:

  • যখন আপনি এটি ক্রম হিসাবে অ্যাক্সেস করতে চান (যেহেতু তালিকাগুলি সরাসরি নতুন সামগ্রী বরাদ্দ না করেই সেককে সমর্থন করে)
  • প্রস্তুত করা হচ্ছে - কনস বা পছন্দের সংযোগের সাথে তালিকার শুরুতে যুক্ত করা হল হ'ল (1)

3
এমনকি উভয় প্রান্তে যুক্ত / অপসারণের সময় একটি তালিকা একটি দুর্দান্ত ভয়ঙ্কর পছন্দ is একটি deque অনেক ভাল (সিপিইউ এবং বিশেষত স্মৃতিতে)। Github.com/pjstadig/deque-clojure
বক্স

2
পুনঃ ~O(1), যাঁদের জন্য এই ব্যয়ের ব্যাখ্যাটি সহায়ক হতে পারে - স্ট্যাকওভারফ্লো
সেকশনস

13

শুধু একটি দ্রুত পাশ নোট:

"আমি পড়েছি ভেক্টরগুলি সেকস নয়, তবে তালিকাগুলি রয়েছে।" 

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

user> (class (list 1 2 3))
clojure.lang.PersistentList

user> (class (seq (list 1 2 3)))
clojure.lang.PersistentList

user> (class (seq [1 2 3]))
clojure.lang.PersistentVector$ChunkedSeq

সেকের একটি শর্টকাট রয়েছে যা এটি ইতিমধ্যে একটি সিক হলে তার যুক্তিটি ফিরিয়ে দেয়:

user> (let [alist (list 1 2 3)] (identical? alist (seq alist)))
true
user> (identical? (list 1 2 3) (seq (list 1 2 3)))
false

static public ISeq seq(Object coll){
        if(coll instanceof ASeq)
                return (ASeq) coll;
        else if(coll instanceof LazySeq)
                return ((LazySeq) coll).seq();
        else
                return seqFrom(coll);
}

তালিকাগুলি ক্রম হয়, যদিও অন্যান্য জিনিস পাশাপাশি হয়, এবং সমস্ত ক্রম তালিকা নয়।


আমি একটি ছোট পয়েন্ট বাছাই করতে চাই না, এটি কেবল সামান্য কিছু উপকারীকে নির্দেশ করার সুযোগ। অনেকে ইতিমধ্যে এটি জানতে পারবেন :)
আর্থার আলফেল্ট

2
আপনি এর classপরিবর্তে মানে না class??
কেরুব

আপনার উদাহরণ ক্লোজার আপডেটগুলি অনুসরণ করে পরিবর্তিত হয়েছে কিনা তা নিশ্চিত নয় (আমি মনে করি আমি 1.5 এর উপরে আছি) তবে আপনার দুটি উদাহরণ clojure.lang.PersistentListআমার জন্য ফিরে আসে । আমি ধরে নিচ্ছি আপনি classনা লিখতে চেয়েছিলেন class?
অ্যাড্রিয়ান মৌআত

আমি সত্যিই করেছি! আমি এটি ঠিক করব
আর্থার উলফেল্ট

তবুও একটি বাচ্চা বিভ্রান্ত; যেহেতু classআপনি উল্লিখিত এই উভয় এক্সপ্রেশনটির জন্য একই পার্সেন্টিস্টলিস্টটি ফেরত দেয়, এটি বোঝাচ্ছে যে ক্রম এবং তালিকাগুলি প্রকৃতপক্ষে ঠিক একই জিনিস?
জনবেকারস 3:21 এ 5
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.