গোলং কেন আমাদের একটি সেট ডেটাস্ট্রাকচার নেই [বন্ধ]


129

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


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

উত্তর:


83

আংশিকভাবে, কারণ গোতে জেনেরিকস নেই (তাই আপনার প্রতিটি ধরণের জন্য একটি সেট টাইপ লাগবে, বা প্রতিচ্ছবিতে ফিরে আসবে, যা অদক্ষ।

আংশিকভাবে, কারণ আপনার যদি প্রয়োজনীয় সমস্ত কিছু "পৃথক উপাদানগুলিকে একটি সেটে যুক্ত / সরান" এবং "তুলনামূলকভাবে স্থান-দক্ষ" হয়, তবে আপনি কেবলমাত্র একটি map[yourtype]bool(এবং সেটের trueকোনও উপাদানটির জন্য মান সেট করে) এর একটি মোটামুটি বিট পেতে পারেন ) বা, আরও স্থান দক্ষতার জন্য, আপনি একটি খালি কাঠামোটিকে মান হিসাবে ব্যবহার _, present = the_setoid[key]করতে পারেন এবং উপস্থিতি যাচাই করতে ব্যবহার করতে পারেন ।


1
এছাড়াও, অন্য কোডে সেটটি "ইনলাইন করে", বা প্রয়োজনের সময় আপনার নিজের সেট টাইপটি সংজ্ঞায়িত করে আপনার নিজের কোডে কেবল এটি নিজের লেখায় লিখতে হবে বলে মনে হয় গো-র আত্মা। যাইহোক, উদাহরণস্বরূপ সি ++ তে একটি স্ট্যান্ড :: সেট <টি> ব্যবহার করা কোনও ফাংশন বাস্তবায়নের অংশ হিসাবে বা অন্য কোনও ডেটা স্ট্রাকচার বাস্তবায়নের অংশ হিসাবে সর্বদা ঘটছে। অতএব, কেবলমাত্র মানচিত্র এবং টুকরোগুলি এবং অন্য যে কোনও বিল্ডিং ব্লকগুলির আপনার প্রয়োজন বোধ করে কোনও বিল্টিন সেট ছাড়াই সরাসরি অন্য ডেটা স্ট্রাকচারটি প্রয়োগ করুন। একটি সেট প্রতিটি ব্যবহার যাইহোক যাইহোক এটি কিছুটা ভিন্নভাবে ব্যবহার করতে চলেছে :)
বজরেক এবার্ট

1
তবে সাধারণত আপনার নিজের কোনও সেট <foo> নিজেই প্রয়োজন হয় না, আপনি আরও বড় কিছু বাস্তবায়নের অংশ হিসাবে একটি সেট <Foo> ব্যবহার করেন। আমি প্রচুর কোড দেখেছি যেখানে "পুনরায় ব্যবহারযোগ্য" উপাদান অন্তর্ভুক্ত করার জন্য আপনার যা করতে হবে তা কেবল প্রয়োজন এড়ানোর চেয়ে আরও খারাপ। সুতরাং এখানে আমাদের একটি সেট রয়েছে <ফু>, সেখানে ফাংশনটির একটি সেট প্রয়োজন <বার>, উফ, আমাদের কী এখনও সমবায় রয়েছে, বা কোনও জিনিসকে এই জিনিসটির মতো করে তুলতে কোনও র্যাপারফ্যাক্টরি তৈরি করার পদ্ধতি ইত্যাদিও হতে পারে যে অন্য ফাংশনটি সত্যই কেবল এমন একটি ইন্টারফেস দরকার যা সদস্যতার জন্য যাচাই করতে পারে, সুতরাং এটি <ফু> সেটটি প্রেরণ করবেন না।
বজার্কে এবার্ট

42
সুতরাং যদি এর জেনেরিকস না থাকে তবে কীভাবে 'জেনেরিক' মানচিত্র প্রয়োগ করা হয়?
ফারমিন সিলভা

26
নোট করুন যে আপনি যদি বাইটগুলি সংরক্ষণ করতে চান তবে আপনি এর map[T]struct{}পরিবর্তে ব্যবহার করতে পারেন map[T]bool
উত্সব


69

একটি কারণ হ'ল মানচিত্র থেকে একটি সেট তৈরি করা সহজ:

s := map[int]bool{5: true, 2: true}
_, ok := s[6] // check for existence
s[8] = true // add element 
delete(s, 2) // remove element

মিলন

s_union := map[int]bool{}
for k, _ := range s1{
    s_union[k] = true
}
for k, _ := range s2{
    s_union[k] = true
}

ছেদ

s_intersection := map[int]bool{}
for k,_ := range s1 { 
  if s2[k] {
    s_intersection[k] = true
  }
}

অন্যান্য সেট সেট অপারেশনগুলি বাস্তবায়ন করা সত্যিই এত কঠিন নয়।


10
অস্তিত্বের জন্য পরীক্ষা করা সহজভাবে মানচিত্রকে সূচক করে। যেহেতু এটি এতে না থাকে তাই শূন্য মান (যা হ'ল false) তা সঠিকভাবে তা জানাবে। পরীক্ষার জন্য কমা-ওকে আইডিয়মের দরকার নেই।
আইসিজা

2
ছেদ জন্য বাস্তবায়ন পার্থক্য মত দেখতে।
মসিফিল

1
@ কিটসিল আপনাকে ধন্যবাদ আপডেট করা হয়েছে।
সালভাদোর ডালি

34
map[int]struct{}পরিবর্তে এটি ব্যবহার করা আরও অনুকূল bool, কারণ খালি স্ট্রাক্ট মেমরিতে 0 বাইট দখল করে। আমি সম্প্রতি এই gist.github.com/bgadrian/cb8b9344d9c66571ef331a14eb7a2e80
বিজি অ্যাড্রিয়ান

13
এটি এতটা সহজ নয়। আপনি যে কোনও জায়গায় সেট ব্যবহার করার দরকার আছে কেবল সেই কোডটি লিখলে তা আজকাল আমার কাছে হাস্যকর বলে মনে হচ্ছে। সংগ্রহ সমর্থন যে কোনও ভাষা দ্বারা সরবরাহ করা উচিত। আরও ভাল উত্তর ভাবেন যে গো এখনও পরিপক্ক নয়। আমি নিশ্চিত যে খুব শীঘ্রই এটি কভার করার জন্য গ্রন্থাগার থাকবে।
স্টিপ

5

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

অন্য কারণটি হ'ল, এটি কোনও সেটের "ডান" বাস্তবায়ন কী তা একেবারেই পরিষ্কার নয়:

  1. একটি কার্যকরী পদ্ধতির রয়েছে:

    func IsInEvenNumbers(n int) bool {
        if n % 2 == 0 {
            return true
        }
       return false
    }

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

  1. বা আপনি ডালি দেখানোর মতো একটি মত-মত পদ্ধতির কাজ করেন।

মানচিত্রের কোনও সমস্যা নেই, যেহেতু আপনি মানটির সাথে সম্পর্কিত কিছু সঞ্চয় করেন।


2
বিট-ইন সেটগুলি পরিচালনা করতে, পাস্কাল একাধিক বাইনারি (দ্বি-আর্গমনেন্ট) অপারেটরগুলি ওভারলোড করে: +ইউনিয়নের -জন্য, পার্থক্যের *জন্য, ছেদ <=জন্য, সাবসেটের >=জন্য, সুপারসেটের =জন্য, সাম্যতার <>জন্য, অসমতার inজন্য এবং সদস্যতার জন্য। সুতরাং গো তে, এটি কেবলমাত্র একক নতুন কীওয়ার্ড হবে - in। অন্যদিকে, পাস্কালের অন্তর্নির্মিত সেটগুলি কেবলমাত্র "অর্ডিনাল" - এ কাজ করে যা কোনও আকারের কোনও আকারের পূর্ণসংখ্যার মানের অন্তর্নিহিত প্রতিনিধিত্ব করে।
kostix

9
সেটটি বাস্তবায়নের একাধিক উপায় রয়েছে তা অন্য অনেকগুলি ভাষা তাদের সরবরাহ থেকে বিরত রাখেনি।
আগস্ট

@ কোস্টিক্স: গো এমনকি সিনট্যাক্সটি ব্যবহার করতে পারত s[key](যেন এটি sছিল map[T]bool) এর পরিবর্তে key in s
ম্যাসিফিল

2
কেবল ফিরে না আসার কোনও কারণ n % 2 == 0?
জোও আন্ড্রেড

4

আরেকটি সম্ভাবনা হ'ল বিট সেটগুলি ব্যবহার করা, যার জন্য কমপক্ষে একটি প্যাকেজ রয়েছে বা আপনি বিল্ট-ইন বড় প্যাকেজটি ব্যবহার করতে পারেন । এই ক্ষেত্রে, মূলত আপনাকে আপনার অবজেক্টকে সূচকে রূপান্তর করার জন্য একটি উপায় নির্ধারণ করতে হবে।


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