【问题标题】:Print elements in `O(j)`?在`O(j)`中打印元素?
【发布时间】:2020-11-07 12:41:34
【问题描述】:

我有N 个人,想参加选举。

对于每个人,我想在O(1) 中保存给他投了多少票以及他给了其他人多少票。

( 我已经通过声明一个长度为N 的数组完成了该部分,每个单元格中有两个属性;takengiven。 当 1 对 2 投票时,我将个人 2 的 taken 和个人 1 的 given 一个一个地增加。)

我如何打印在O(j) 中没有获得任何投票的所有个人,其中j 是这些个人的数量?

我只能使用O(N) 空间。 (请解释想法而不是代码)

注意:我只知道数组、列表和双向链表。 (请解释想法而不是代码)并且我想在 O(1) 中初始化数据结构

【问题讨论】:

  • 如果你没有显示/询问代码,那么 C++ 标签似乎是不必要的。
  • 您可以存储一个链接的个人哈希集(大小 N),并在他们被投票时从集合中删除(常数时间摊销),留下一个大小为 J 的哈希集,可迭代由于链表,在 J 时间。
  • 链表散列结构将链表和散列映射结合起来,保证了特定的性能。这里是 Java 的简要概述,但可以用任何语言实现:java67.com/2012/08/…
  • 如果您在一个数组中有完整的候选人列表,那么每当您找到一个已收到或投过票的候选人时,您都可以从该数组中删除该候选人。 final 数组将只有未收到或未投票的用户
  • 该用户在此处更详细地转发了此问题:Job Interview Algorithm?

标签: arrays algorithm data-structures structure


【解决方案1】:

如果你得到 N 个个人的列表并将其分成 2 个:

  • 一个包含获得选票的个人的列表,我们称之为V
  • 一个包含未获得选票的个人的列表,我们称之为J

您最初会将所有个人都放在同一个列表 (J) 中,当他们获得选票时,您将他们从一个列表 (J) 中删除,然后将它们放入另一个列表 (V)。

假设您不计算维护 2 个列表所需的开销,这仍应满足您的 O(N) 空间限制,因为 |N| = |J| + |V|。

因此,根据您要打印的结果,您将在适当的列表上进行迭代。如果您需要打印所有信息,则需要对两者进行迭代。

根据您的问题,要在 O(K) 中获得票数最多的前 K 个人,您可以:

  1. 假设您对数据的插入/更新方式没有任何限制,您可以在每个插入/更新操作中使用该列表。这样,当您需要阅读列表的内容时,您就可以知道列表已经排序,表现最好的个人位于列表的开头。
  2. 有点相似,但在幕后有更多内容,您可以查看Map 数据结构。如您所见,还可以提供一个compare 函数。根据文档,元素将根据此compare 函数的结果进行排序。两个选项都做同样的事情,但是在选项 1 中,您正在编写所有代码,而在选项 2 中,您将繁重的工作留给 Map 实现。

【讨论】:

  • @WhiteForce:如果根据您对另一个答案的其他评论,您不能使用地图,那么我不确定您如何在 O(1) 中实现任何目标。
【解决方案2】:

您可以使用 HashMap,Hashmap 的访问复杂度为 O(1)。 在您的情况下,您可以使用投票数作为键和未获得任何投票的人的数组作为值。这将允许您访问 O(1) 中的数组。并在 O(array length "which is j as you states") 中获取数组中的任何人

【讨论】:

  • 对普通哈希图的迭代通常在映射的地址空间(即其容量)中是线性的,而不是在存储的元素数量中。这种区别可能很重要,具体取决于地图的具体实现。
【解决方案3】:

这不是完整的代码,但这种创建哈希映射的逻辑对你有用https://www.geeksforgeeks.org/implementing-multidimensional-map-in-c/ // C++14代码实现二维图 // 并通过 insert() 插入值

#include <bits/stdc++.h> 
using namespace std; 

int main() 
{ 
   int vote_gain = 0;
   int vote_cast = 0;
    // First key type is a string 
    map<string, map<string, int> > m; 

    map<string, map<string, int> >::iterator itr; 
    map<string, int>::iterator ptr; 

    m.insert(make_pair("arun", map<string, int>())); 
    m["arun"].insert(make_pair("received", ++vote_gain));
    m["arun"].insert(make_pair("cast", ++vote_cast));
    for (itr = m.begin(); itr != m.end(); itr++) { 

        for (ptr = itr->second.begin(); ptr != itr->second.end(); ptr++) { 
            cout << "The candidate " << itr->first 
                << " has  " << ptr->first 
                << " a vote " << ptr->second << endl; 
        } 
    } 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多