当前位置: 首页 > 编程笔记 >

插入Delete GetRandom O(1)-C ++中允许重复

轩辕亮
2023-03-14
本文向大家介绍插入Delete GetRandom O(1)-C ++中允许重复,包括了插入Delete GetRandom O(1)-C ++中允许重复的使用技巧和注意事项,需要的朋友参考一下

假设我们要创建一个支持某些操作的数据结构,这些操作必须在O(1)的时间内执行。所以让这些操作像-

  • insert(x):将x插入集合

  • remove(x):从集合中删除x

  • getRandom():这将找到该集合的随机元素形式。

为了解决这个问题,我们将遵循以下步骤-

  • 制作一个数组

  • 制作一张映射

  • 定义一个函数insert(),将需要val,

  • ret:=当val不在m中时

  • 在m [val]的末尾插入nums的大小

  • 在数字末尾插入{val,m [val] – 1}的大小对

  • 返回ret

  • 定义一个函数remove(),将需要val,

  • ret:=当val不在m中时

  • 如果ret不为零,则-

    • 从m删除val

    • last = nums的最后一个元素

    • m [last键] [last值]:= m [val]的最后一个元素

    • nums [[m [val]]的最后一个元素:=最后一个

    • 从m [val]删除最后一个元素

    • 如果m [val]为空,则-

    • 从num中删除最后一个元素

    • 返回ret

    • 定义功能 getRandom()

    • 从集合中返回一个随机元素

    让我们看下面的实现以更好地理解-

    示例

    #include <bits/stdc++.h>
    using namespace std;
    class RandomizedCollection {
    public:
       vector <pair <int, int>> nums;
       unordered_map <int, vector<int>> m;
       RandomizedCollection() {
       }
       bool insert(int val) {
          bool ret = m.find(val) == m.end();
          m[val].push_back(nums.size());
          nums.push_back({val, m[val].size() - 1});
          return ret;
       }
       bool remove(int val) {
          bool ret = m.find(val) != m.end();
          if(ret){
             pair <int, int> last = nums.back();
             m[last.first][last.second] = m[val].back();
             nums[m[val].back()] = last;
             m[val].pop_back();
             if(m[val].empty())m.erase(val);
             nums.pop_back();
          }
          return ret;
       }
       int getRandom() {
          return nums[rand() % nums.size()].first;
       }
    };
    main(){
       RandomizedCollection ob;
       ob.insert(10);
       ob.insert(35);
       ob.insert(20);
       ob.insert(40);
       cout << (ob.getRandom()) << endl;
       ob.remove(20);
       cout << (ob.getRandom()) << endl;
    }

    输入值

    Insert 10, 35, 20, 40, then get one random number, say 40, then remove 20, again get random element, that is say 35.

    输出结果

    40
    35
     类似资料:
    • 我有两个表,它们的关系如下图所示 我创建了Hibernate数据模型,如下所示 我打算创建如下实体 当我运行这个时,我得到以下错误 org.hibernate.MappingException:实体映射中的重复列:*。SSI 列:CLIENT_ID(应使用 insert=“false” update=“false”进行映射) 如果我设置为CLIENT_ID,它将再次错误关于插入的混合 如果我为所有

    • 该程序将两个元素都添加到Set中。起初我很震惊,因为在向set添加方法时,调用了equals方法。 但是后来我覆盖了hashCode方法: 然后它没有添加。这是令人惊讶的,因为Set和add()方法的Javadoc表示,它在向集合中添加时只检查equals()。 这是add()的javadoc: 然后我意识到HashSet被实现为一个HashMap,在这个map中,对象的hashCode被用作键。

    • 问题内容: 我正在使用Java,并且试图从某个http链接获取XML文档。我使用的代码是: 不要关注,它是一些特殊的类,就像常规输入流一样。 使用上面的代码,有时会出错。我认为这与xml格式错误有关,但我不知道如何解决。 问题答案: 我将我的评论转为答案,因此它可以被接受,并且这个问题不再悬而未决。 造成这种情况的最可能原因是格式错误的响应,其中包括在initial之前的字符。因此,请查看通过HT

    • 问题内容: 该程序将两个元素都添加到集合中。起初我很震惊,因为在添加设置方法时,调用了equals方法。 但是后来我覆盖了hashCode方法: 然后没有添加。这是令人惊讶的,因为Set和add()方法的Javadoc说它在添加到Set中时仅检查equals()。 这是add()的javadoc: 然后我意识到HashSet被实现为HashMap,并且在地图中,对象的hashCode用作键。因此,

    • 问题内容: 我似乎无法使实例正常工作。我使用的代码如下: 子类 该代码输出 问题答案: 您需要覆盖。而不是这样做,您实现了一个带有signature 的方法。因此,您使用的是为相等性测试定义的默认方法。 默认实现基于对象标识,因此,该集合“允许”您添加两个在语义上相等的不同对象。

    • 这里是Java/C开发者。试图学习C语言,但我对数组的内存分配感到困惑。 这里发生了什么? 输出 怎么会这样?为什么我不能越界异常或程序崩溃?我能无限地做到这一点吗?在这种情况下,我的数组长度是多少?如果我的数组允许我将值放在界限之外,那么通过分配内存有什么意义?这对我来说毫无意义。