哪个是用于存储关注者的最有效的数据结构,如下所示

时间:2014-03-02 14:54:00

标签: java arrays

我在java中有这两个方法

  • public Int[] getFollows
  • public Int[] getFollowers

getfollows(user1)返回users后跟user1

的数组

getfollowers(user1)会返回users

后面的user1数组

我当前的数据结构是一个二维数组,所以我有

对于user1的每位新关注者,我都会followerArray[user1][followers++]=newFollower 这意味着getFollowers()将在O(1)时间内运行,因为我return followerArray[user1]

然而,方法getFollows()将要求我使用两个for循环来搜索所有数组N次,因此将在O(N ^ 2)中运行。

有没有办法可以在不牺牲getFollows的速度的情况下降低方法getFollowers()的时间复杂度

3 个答案:

答案 0 :(得分:2)

您可以使用2个地图,一个用于跟踪关注者,其他用于跟踪。它确保了持续的查找时间。

答案 1 :(得分:1)

将数据存储在您喜欢的任何数据结构中。这非常简单,数据库将做什么。重要的一步是它的指数。特别是你有

AnyDataStructure users; // supports get(userKey) operation for some userKey; e.g. array index, integer, etc.

您需要创建两个索引,以便查找。

Map<UserKey, List<UserKey>> followers = new HashMap<>();
Map<UserKey, List<UserKey>> follows = new HashMap<>();
是的,这是多余的。指数是多余的。请注意,他们不是 多余的,因为他们不会从头开始再次存储重复的用户,只要您使用的是任何密钥。您必须使用AnyDataStructure维护这些内容,即每当添加,删除用户或添加或删除关注者时,您都必须维护地图。

请注意,这些地图可能只是User类的成员变量。

List<UserKey> followers;
List<UserKey> following;

因此,更新关注者/关注只是更新用户自己。当你添加越来越多的功能时,这可能无法维护,但到目前为止,你几乎肯定应该在真正的关系或NoSQL数据库中这样做。

答案 2 :(得分:0)

使用HashSet可以将订单减少到O(n)

HashMap<Integer, HashSet<Integer>>  follows;

Integer[] getFollows(int user) {
    HashSet<Integer> r = follows.get(user);
    return r.toArray(new Integer[r.size()]);
}

Integer[] getFollowers(int user) {
    ArrayList<Integer> a = new ArrayList<Integer>();
    for (Integer i : follows.keySet())
        if (follows.get(i).contains(user))
            a.add(i);
    return a.toArray(new Integer[a.size()]);
}