【问题标题】:Implementing a Set Using a Sorted Array使用排序数组实现集合
【发布时间】:2015-12-14 21:09:40
【问题描述】:

这是一个数据结构问题,也是关于实现的。集合通常使用 BST 实现,但我的教授希望我们知道如何在仅给出有限选项的情况下实现某些数据结构。所以他希望我们能够理解如何只使用一个数组来创建一个集合。

使用标准(未排序)数组我了解实现/复杂性...

void add(Student[] arr, Student findstu)
{
    Student stu = new Student();
    int i=0;
    boolean found = false;
    while(stu!=NULL)
    {
        stu = arr[i++];
        if (stu==findstu)
        {
             found = true;
        }
     }
    if (found==false)
    {
         arr[i+1] = findstu;
    }
 }

添加/删除/包含几乎是相同的代码,都将具有第一个 while 循环,这将使它们成为 O(n)。

但是如果我们使用排序数组,为什么包含 O(lgn) 和添加/删除 O(n)?

【问题讨论】:

  • 那个 sn-p 无效(不会编译),即使修复也不是最理想的
  • @Amit 你能详细说明你在说什么吗?这里的想法不是拥有最好的运行时......只需在给定的约束条件下实现一些东西
  • Student stu = new Student(); 是语法错误,因为 stu 不是指针。这是次优的,因为您在不需要它的情况下分配和初始化对象
  • 这也是内存泄漏,因为你在堆上初始化了一个Student 对象并且永远不会删除它
  • 我可以直接说Student stu;,这样会更合适吧?我不需要在堆上创建对象

标签: c++ arrays set


【解决方案1】:

搜索将是O(logN),因为由于数组已排序,您可以应用复杂度为O(logN) 的二进制搜索。

插入和擦除将是O(N) 复杂度(即线性时间),因为每次您尝试在排序后的数组中插入或删除一个元素时,您都必须将数组的元素移动一个位置,即@987654324 @ 线性时间复杂度。

【讨论】:

    猜你喜欢
    • 2012-08-27
    • 2013-04-10
    • 2014-02-23
    • 1970-01-01
    • 1970-01-01
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    相关资源
    最近更新 更多