2010-07-22 94 views
2

这个问题让我回到了我的大学时代,但是自从那些日子以来(20多年前)我还没有编码,我有点生疏了。选择元素在数组中有更多重复元素C

基本上我有一个256个元素的数组。数组中可能有1个元素,即14或256.该数组包含从系统请求数据的用户的用户名。我正在计算列表中的重复项,以便我可以优先考虑大多数请求的用户。所以,如果我有一个列表如:

{john, john, paul, james, john, david, charles, charles, paul, john} 

我会选择约翰,因为它出现了4次。 我可以迭代数组并将元素复制到另一个元素并开始计数,但一段时间后会变得复杂。正如我所说,我很生锈。

我相信有一个简单的方法来做到这一点。有任何想法吗?代码在这里会非常有帮助。 谢谢!

编辑:

缓冲区被声明为:

static WCHAR userbuffer[150][128]; 

可能有多达150个用户,并且每个用户名是高达128个字符长。

+0

的地图是由键排序,而不是价值。 – 2010-07-22 13:32:58

+1

@Guillaume Lebourgeois我想我的大脑暂时不工作:D谢谢。 – AraK 2010-07-22 13:33:46

回答

2

这是我会怎么解决这个问题:

首先,定义一个结构来保存用户名和频率计数,使他们的阵列具有相同数量的元素你userbuffer阵列(在你的榜样150)。现在

struct user { 
    WCHAR name[128]; 
    int  count; 
} users[150]; 

,遍历userbuffer并为每个条目,检查,看看是否有users具有相同name的条目。如果找到匹配项,请在users中增加该条目的count。如果找不到匹配项,请将用户名userbuffer复制到users的空白条目中,并将该用户的count设置为1

在处理完整个userbuffer阵列后,可以使用users阵列中的count值查看谁的请求最多。您可以手动遍历它以查找最大值或使用qsort

这不是最有效的算法,但它是直接的,不会做任何太聪明或奇特的事情。

编辑: 要快速排序的users数组,你需要定义一个简单的函数,快速排序可以使用排序。在这个例子中,这样的事情应该工作:

static int compare_users(const void *p1, const void *p2) { 
    struct user *u1 = (struct user*)p1; 
    struct user *u2 = (struct user*)p2; 

    if (u1->count > u2->count) 
     return 1; 
    if (u1->count < u2->count) 
     return -1; 
    return 0; 
} 

现在,你可以通过这个功能来qsort,如:

qsort(users, 150, sizeof(struct user), compare_users); 
+0

好吧,我有结构填充正确的数据(约翰= 4,保罗= 2,詹姆斯= 1等)我正在尝试qsort(),但我遇到了麻烦。你将如何检查struct []。count中最大的值(如果有的话)? – 2010-07-22 18:46:51

+0

谢谢,我实际上只是通过比较计数和保存该数字和索引int来完成它,并在循环结束时对它们进行结构化和放大。谢谢您的帮助! – 2010-07-22 19:08:32

-1

按照AraK提出的使用std::map,您可以不重复地存储您的名字,并将您的名字与一个值相关联。

一个简单的例子:

std::map<string, long> names; 

names["john"]++; 
names["david"]++; 

然后,您可以搜索的键具有最大的价值。

+0

问题被标记为C,而不是C++ – Doomsday 2010-07-22 13:44:30

+0

由于mraleph说他有点生疏,并且没有编码20年,我想他可以欣赏C++的答案,并且没有限制在C中做这个... – 2010-07-22 14:06:29

+0

感谢答案,但正如我注意到的那样,这是在C – 2010-07-22 15:43:15

7

1 - 排序你的数组。

2 - set maxcount = 0;

3 - 迭代数组并计数直到visitNEXT用户名。

4 - 如果count> maxcount,则设置maxcount进行计数并将名称保存为候选项。

5 - 循环完成后,提取候选人。

+0

是的,这在纯C中相当容易,这要归功于qsort()库函数。更快的选项是使用散列表,但它需要更多的工作(除非使用第三方库)。 – 2010-07-22 13:50:02

+0

好的。我在这里感到困惑。你有一个可以做到这一点的片段吗? – 2010-07-22 15:44:07

+0

他会不会让用户的最大数量。如何让用户优先获得第二名? 他将不得不再次迭代。我认为这是可以避免的。 – 2010-07-22 15:52:47

0

你的意思是“阵列上可能有1个元素,14或256”。是14和256元素数字?

如果您可以更改数组定义,我认为最好的方法是定义 一个包含两个字段username和numberOfRequests的结构。当用户请求时,如果列表中存在用户名,numberOfRequest将会增加。如果这是用户第一次请求用户名,则应将其添加到列表中,并且numberOfRequests将为1.

如果您不能更改数组定义,则可以使用快速排序或其他算法对数组进行排序。在此之后很容易计算请求的数量。

但是,也许有一个图书馆具有此功能,但我怀疑你可以在标准图书馆找到一些东西!

+0

我的意思是,在任何给定的时间该数组可能会部分填充,完全或根本没有 – 2010-07-22 14:25:32