আমি সত্যিই গুগল গোলং পছন্দ করি তবে বাস্তবায়নকারীদের স্ট্যান্ডার্ড লাইব্রেরি থেকে সেটগুলির মতো একটি মৌলিক ডেটা কাঠামো বাদ দিয়ে যুক্তি কী তা ব্যাখ্যা করতে পারে?
আমি সত্যিই গুগল গোলং পছন্দ করি তবে বাস্তবায়নকারীদের স্ট্যান্ডার্ড লাইব্রেরি থেকে সেটগুলির মতো একটি মৌলিক ডেটা কাঠামো বাদ দিয়ে যুক্তি কী তা ব্যাখ্যা করতে পারে?
উত্তর:
এই বাদ দেওয়ার একটি সম্ভাব্য কারণ হ'ল মানচিত্র সহ সেট মডেল করা সত্যিই সহজ।
সত্য কথা বলতে গেলে আমি মনে করি এটি কিছুটা পর্যবেক্ষণের বিষয়, তবে পার্লের দিকে তাকালে, গল্পটি ঠিক একই রকম। পার্লে আপনি তালিকা এবং হ্যাশ টেবিল পাবেন, গোতে আপনি অ্যারে, স্লাইস এবং মানচিত্র পাবেন। পার্লে আপনি সাধারণত কোনও সেট সম্পর্কিত যে কোনও এবং সমস্ত সমস্যার জন্য হ্যাশ টেবিল ব্যবহার করতে চান, এটি একই ক্ষেত্রে প্রযোজ্য।
উদাহরণ
গোতে একটি সেট ইনস অনুকরণ করতে, আমরা একটি মানচিত্র সংজ্ঞায়িত করি:
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{}
আপনি যে ফলাফলের ফলাফল দিয়েছেন তা সেক্ষেত্রে এটি করা সম্ভব ।
map[int]bool
এক map[int]struct{}
পরিবর্তে ব্যবহার করতে পারেন । আমি শেষ পছন্দ।
map[int]struct{}
.. struct{}
0 বাইট লাগে।
map[int]struct{}
আপনি ব্যবহার করতে পারবেন না if mymap["key"] {
সদস্যপদের জন্য বার করো। গুগল ব্যবহারের প্রস্তাব দেয়bool
("একটি সেট প্রয়োগ করা যেতে পারে" এর জন্য অনুসন্ধান করুন)।
আমি মনে করি golang
এটি সরলতার উপর ফোকাস সঙ্গে করতে হবে । set
সঙ্গে সত্যিই দরকারী পরিণত র difference
, intersection
, union
, issubset
, ইত্যাদি .. পদ্ধতি। সম্ভবত golang
দল অনুভব করেছে যে এটি একটি ডেটা কাঠামোর জন্য খুব বেশি। কিন্তু অন্যথায় একটি "বোবা সেট" শুধুমাত্র আছে add
, contains
এবং remove
সহজে সঙ্গে প্রতিলিপি করা যেতে পারে map
যেমন @jozefg দ্বারা ব্যাখ্যা।
পূর্ববর্তী উত্তরগুলি কেবলমাত্র কাজ করে যদি কীটি অন্তর্নির্মিত প্রকারের হয়। পূর্ববর্তী উত্তরের পরিপূরক করতে, এখানে একটি সেটটি কার্যকর করার একটি উপায় যার উপাদানগুলি ব্যবহারকারী-সংজ্ঞায়িত প্রকার:
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))}
}
Contains
লিনিয়ার সময় aMap[]
লাগে এবং ধ্রুবক সময় লাগে। আরও ভাল সমাধান অভ্যন্তরীণভাবে প্রতিটি সদস্যের বিষয়বস্তুর উপর ভিত্তি করে একটি অনন্য কী তৈরি করতে পারে এবং ধরণটি সরবরাহ করে এমন ধ্রুবক সময় অনুসন্ধান map
করে। এমনকি ক্যাশে আচরণ ইত্যাদি বিবেচনা করে এমন দ্রুত সমাধানগুলিও বিদ্যমান।