RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1412099
Accepted
Quester
Quester
Asked:2022-07-21 01:37:43 +0000 UTC2022-07-21 01:37:43 +0000 UTC 2022-07-21 01:37:43 +0000 UTC

golang 中的子集

  • 772

大家好。你可以创建一个集合,你可以像这样填充它

func main() {
    m := make(map[int]bool, 0)
    for i := 0; i < 20; i++ {
        m[i] = true
    }
    log.Println(m)
}

是这样吗,如果是这样,如何为集合创建一个子集

需要这样的东西

множество[подмножество1{член1, член2, член3...}, подмножество2{член1, член2, член3 ...}...etc]

package main

import (
    "math"
    "sync"
)

type Set struct {
sync.Mutex
mp map[*SubSet]bool
}

type SubSet struct {
    sync.Mutex
    mp map[float64]bool
}

func NewSet() *Set {
    return &Set{
        mp: map[*SubSet]bool{},
    }
}

func NewSubSet() *SubSet {
    return &SubSet{
        mp: map[float64]bool{},
    }
}

func (s *SubSet) InsertInSubset(key float64) *SubSet {
    s.Lock()
    defer s.Unlock()
    s.mp[key] = true
    return s
}

func (s *Set) InsertInSet(key *SubSet, value bool) *Set {
    s.Lock()
    defer s.Unlock()
    s.mp[key] = true
    return s
}

func CelcionSet(celcions []float64) {
    celcions = QS(celcions)
    lencelcions := len(celcions)
    set := NewSet()
    for i := 0; i < lencelcions; i++ {
        rng := math.Trunc(celcions[i]/10) * 10
        sub := NewSubSet()
        set.InsertInSet(sub.InsertInSubset(celcions[i]), true)//это конечно же не сработает, но не понимаю как заставить работать чтобы в множество вставлялось подмножество
    }
}

func QS(nums []float64) []float64 {
    // find len of arr
    lennums := len(nums)
    // if arr contains less then 2 items, nothing to sort
    if lennums < 2 {
        return nums
    }
    toehold := nums[0] //or nums[lennums/2]
    // items which less than toehold
    left := make([]float64, 0)
    // items which more than toehold
    right := make([]float64, 0)
    for _, num := range nums[1:] {
        // move to right if item more than toehold
        if num > toehold {
            right = append(right, num)
        } else {
            // move to left if item less than toehold
            left = append(left, num)
        }
    }
    // recoursive sorting left side
    nums = append(QS(left), toehold)
    // recoursive sorting right side
    nums = append(nums, QS(right)...)
    return nums
}
golang
  • 1 1 个回答
  • 46 Views

1 个回答

  • Voted
  1. Best Answer
    Alexander Pavlov
    2022-07-21T02:39:46Z2022-07-21T02:39:46Z
    package main
    
    import (
        "fmt"
        "math"
    )
    
    func main() {
        s := NewSet()
        s.Insert(-18.1)
        s.Insert(-11.2)
        s.Insert(23.6)
        s.Insert(22.5)
        s.Insert(28.3)
        s.Insert(28.3)
    
        fmt.Println(s.GetAll())
        fmt.Println(s.GetSubsetFor(-10))
    
    }
    
    type measurement int64
    type subsetId int
    
    type Set struct {
        subsets  map[subsetId]*Subset
    }
    
    type Subset struct {
        elements map[measurement]int
    }
    
    func NewSet() *Set {
        return &Set{
            subsets:  map[subsetId]*Subset{},
        }
    }
    
    const roundFactor = 10
    
    func toStorage(val float64) (subsetId, measurement) {
        m := measurement(math.Round(val* roundFactor))
        id := subsetId((int(val) / 10 ) * 10)
        return id, m
    }
    
    func fromStorage(m measurement, count int) []float64 {
        val := float64(m) / float64(roundFactor)
        var vals []float64
        for i:=0; i < count; i++ {
            vals = append(vals, val)
        }
        return vals
    }
    
    func (s *Set) Insert(val float64) {
        id, m := toStorage(val)
        if ss, found := s.subsets[id]; !found {
            s.subsets[id] = &Subset{
                elements: map[measurement]int{m: 1},
            }
        } else {
            ss.elements[m]++
        }
    }
    
    func (s *Set) DeleteOne(val float64) {
        id, m := toStorage(val)
        if ss, found := s.subsets[id]; found {
            ss.elements[m]--
        }
    }
    
    func (s *Set) DeleteAll(val float64) {
        id, m := toStorage(val)
        if ss, found := s.subsets[id]; found {
            delete(ss.elements, m)
        }
    }
    
    func (s *Set) Contains(val float64) bool {
        id, m := toStorage(val)
        if ss, found := s.subsets[id]; found {
            if c, found := ss.elements[m]; found && c > 0 {
                return true
            }
        }
        return false
    }
    
    func (s *Set) GetSubsetFor(val float64) []float64 {
        id, _ := toStorage(val)
        if ss, found := s.subsets[id]; found {
            var vals []float64
            for m, count := range ss.elements {
                vals = append(vals, fromStorage(m,count)...)
            }
            return vals
        }
        return nil
    }
    
    func (s *Set) GetAll() []float64 {
        var vals []float64
        for _,ss := range s.subsets {
            for m, count := range ss.elements {
                vals = append(vals, fromStorage(m,count)...)
            }
        }
        return vals
    }
    
    
    • 1

相关问题

  • windows上的protoc编译错误

  • 递归打印包依赖

  • Golang 算法 XTEA ECB 库“golang.org/x/crypto/xtea”

  • 如何将 IMEI 转换为字节并返回 golang

  • 如何创建文件并将其移动到新目录?

  • go中的函数参数中是否有cv-qualifier的类似物?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5