গোলংয়ে ডেটা স্ট্রাকচার সেট করে


69

আমি সত্যিই গুগল গোলং পছন্দ করি তবে বাস্তবায়নকারীদের স্ট্যান্ডার্ড লাইব্রেরি থেকে সেটগুলির মতো একটি মৌলিক ডেটা কাঠামো বাদ দিয়ে যুক্তি কী তা ব্যাখ্যা করতে পারে?


8
ভাষাটিকে আসলে গো, না বলে গোল বলা হয়
jozefg

92
তবে "গোলং" আরও সন্ধানযোগ্য
ম্যাট

18
আরও অনুসন্ধানযোগ্য উপায়। গুগলিং "গো সেট" কালো এবং সাদা টুকরা সহ একটি কাঠের বোর্ডের চিত্রগুলি ফিরিয়ে দেয়।
ডগ রিচার্ডসন

উত্তর:


67

এই বাদ দেওয়ার একটি সম্ভাব্য কারণ হ'ল মানচিত্র সহ সেট মডেল করা সত্যিই সহজ।

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

উদাহরণ

গোতে একটি সেট ইনস অনুকরণ করতে, আমরা একটি মানচিত্র সংজ্ঞায়িত করি:

set := make(map[int]bool)

কিছু যুক্ত করা যেমন সহজ:

i := valueToAdd()
set[i] = true

কিছু মুছে ফেলা ন্যায়সঙ্গত

delete(set, i)

এবং এই নির্মাণের সম্ভাব্য বিশ্রীতাকে সহজেই বিমূর্ত করা যায়:

type IntSet struct {
    set map[int]bool
}

func (set *IntSet) Add(i int) bool {
    _, found := set.set[i]
    set.set[i] = true
    return !found   //False if it existed already
}

এবং মুছুন এবং পেতে একইভাবে সংজ্ঞায়িত করা যায়, আমার এখানে সম্পূর্ণ বাস্তবায়ন আছে । এখানে বড় বিচ্ছিন্নতার বিষয়টি হ'ল গো-জেনেরিকস নেই। তবে interface{}আপনি যে ফলাফলের ফলাফল দিয়েছেন তা সেক্ষেত্রে এটি করা সম্ভব ।


3
সমন্বিত এবং আকারের পদ্ধতিগুলির সাথে আমার সামান্য-সংশোধিত সংস্করণটি এখানে রয়েছে: play.golang.org/p/tDdutH672-
রিক -777

19
পরিবর্তে map[int]boolএক map[int]struct{}পরিবর্তে ব্যবহার করতে পারেন । আমি শেষ পছন্দ।
গোলমরিচ_চিকো

20
map[int]struct{}.. struct{}0 বাইট লাগে।
বুপাঠি রাজা

2
github.com/fatih/set আমার মানচিত্র এবং খালি স্ট্রাইকগুলির উপর ভিত্তি করে একটি বাস্তবায়ন। এটি থ্রেড নিরাপদ এবং একটি সাধারণ এপিআই রয়েছে।
ফাতেহ আরসলান

6
সঙ্গে map[int]struct{}আপনি ব্যবহার করতে পারবেন না if mymap["key"] {সদস্যপদের জন্য বার করো। গুগল ব্যবহারের প্রস্তাব দেয়bool ("একটি সেট প্রয়োগ করা যেতে পারে" এর জন্য অনুসন্ধান করুন)।
টিম্ম্ম্ম

3

আমি মনে করি golangএটি সরলতার উপর ফোকাস সঙ্গে করতে হবে । setসঙ্গে সত্যিই দরকারী পরিণত র difference, intersection, union, issubset, ইত্যাদি .. পদ্ধতি। সম্ভবত golangদল অনুভব করেছে যে এটি একটি ডেটা কাঠামোর জন্য খুব বেশি। কিন্তু অন্যথায় একটি "বোবা সেট" শুধুমাত্র আছে add, containsএবং removeসহজে সঙ্গে প্রতিলিপি করা যেতে পারে mapযেমন @jozefg দ্বারা ব্যাখ্যা।


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

2

পূর্ববর্তী উত্তরগুলি কেবলমাত্র কাজ করে যদি কীটি অন্তর্নির্মিত প্রকারের হয়। পূর্ববর্তী উত্তরের পরিপূরক করতে, এখানে একটি সেটটি কার্যকর করার একটি উপায় যার উপাদানগুলি ব্যবহারকারী-সংজ্ঞায়িত প্রকার:

package math

// types

type IntPoint struct {
    X, Y int
}

// set implementation for small number of items
type IntPointSet struct {
    slice []IntPoint 
}

// functions

func (p1 IntPoint) Equals(p2 IntPoint) bool {
    return (p1.X == p2.X) && (p1.Y == p2.Y)
}

func (set *IntPointSet) Add(p IntPoint) {
    if ! set.Contains(p) {
        set.slice = append(set.slice, p)
    }
}

func (set IntPointSet) Contains(p IntPoint) bool {
  for _, v := range set.slice {
    if v.Equals(p) {
      return true
    }
  }
  return false
}

func (set IntPointSet) NumElements() int {
    return len(set.slice)
}

func NewIntPointSet() IntPointSet {
  return IntPointSet{(make([]IntPoint, 0, 10))}
}

8
"কাজ করে শুধুমাত্র যদি চাবি একটি বিল্ট-ইন ধরনের হয়" হয় ভুলtype mySet map[IntPoint]boolপুরোপুরি ভাল কাজ করে। একটি মানচিত্রে ব্যবহৃত মূল ধরণের যা প্রয়োজন তা==!= হ'ল এটি এবং এটি । কাঠামোর ধরণের সমতা ভালভাবে সংজ্ঞায়িত করা হয়েছে, আপনার Equalsপদ্ধতিটি সঠিক হওয়া উচিত p1 == p2
ডেভ সি

1
এটি সত্য যে স্ট্রাক্টগুলির জন্য সমতাটি যথাযথভাবে সংজ্ঞায়িত করা হয় তবে স্ট্রাক্টে ক্ষেত্র হিসাবে মানচিত্র বা টুকরোগুলি থাকে তবে সেগুলি মানের পরিবর্তে রেফারেন্সের সাথে তুলনা করা হবে। এটি আপনি যা চান তা নাও হতে পারে।
চেইম-লেইব হালবার্ট

1
আমি এই সমাধানটি নিয়ে কিছুটা সমস্যা নিয়েছি, কারণ সদস্যের সংখ্যা নির্বিশেষে Containsলিনিয়ার সময় aMap[]লাগে এবং ধ্রুবক সময় লাগে। আরও ভাল সমাধান অভ্যন্তরীণভাবে প্রতিটি সদস্যের বিষয়বস্তুর উপর ভিত্তি করে একটি অনন্য কী তৈরি করতে পারে এবং ধরণটি সরবরাহ করে এমন ধ্রুবক সময় অনুসন্ধান mapকরে। এমনকি ক্যাশে আচরণ ইত্যাদি বিবেচনা করে এমন দ্রুত সমাধানগুলিও বিদ্যমান।
চেইম-লেইব হালবার্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.