在普通C中选择数组上具有更多重复项的元素

在普通C中选择数组上具有更多重复项的元素,c,arrays,duplicates,C,Arrays,Duplicates,这个问题让我回到了我的大学时代,但自从那时候(20多年前)我就没有编码了,我有点生疏了 基本上我有一个256个元素的数组。阵列上可能有1个元素,14或256。此数组包含从系统请求数据的用户的用户名。我正在尝试统计列表中的重复项,以便我可以为请求最多的用户提供优先级。因此,如果我有如下列表: {john, john, paul, james, john, david, charles, charles, paul, john} 我会选择约翰,因为它出现了4次。 我可以迭代数组并将元素复制到另一个

这个问题让我回到了我的大学时代,但自从那时候(20多年前)我就没有编码了,我有点生疏了

基本上我有一个256个元素的数组。阵列上可能有1个元素,14或256。此数组包含从系统请求数据的用户的用户名。我正在尝试统计列表中的重复项,以便我可以为请求最多的用户提供优先级。因此,如果我有如下列表:

{john, john, paul, james, john, david, charles, charles, paul, john}
我会选择约翰,因为它出现了4次。 我可以迭代数组并将元素复制到另一个数组中,然后开始计数,但过一会儿它就会变得复杂。正如我所说,我很生疏

我相信有一个简单的方法可以做到这一点。有什么想法吗?这里的代码将非常有用。 谢谢大家!

编辑:

缓冲区声明为:

static WCHAR userbuffer[150][128];
最多可以有150个用户,每个用户名的长度最多为128个字符。

使用AraK的建议,您可以储存不重复的姓名,并将姓名与值关联

一个简单的例子:

std::map<string, long> names;

names["john"]++;
names["david"]++;
std::映射名称;
姓名[“约翰”]+;
姓名[“大卫”]+;
然后,您可以搜索具有最大值的键。

1-对数组进行排序

2-设置maxcount=0

3-迭代数组并计数,直到访问下一个用户名

4-如果count>maxcount,则将maxcount设置为count并将名称另存为候选名称

5-循环完成后,选择候选元素。

您所说的“阵列上可能有1个元素,14或256”是什么意思。14和256是元素数吗

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

如果无法更改数组定义,一种方法是使用快速排序或其他算法对数组进行排序。在此之后,很容易计算请求的数量


然而,也许有一个具有此功能的库,但我怀疑您是否能在标准库中找到一些内容

以下是我解决问题的方法:

首先,定义一个用于保存用户名和频率计数的结构,并使用与
userbuffer
数组相同的元素数(在您的示例中为150)创建一个包含用户名和频率计数的数组

现在,在
userbuffer
中循环,对于每个条目,检查并查看
users
中是否有具有相同
名称的条目。如果找到匹配项,则在
用户
中增加该条目的
计数
。如果未找到匹配项,请将用户名从
userbuffer
复制到
users
中的空白条目中,并将该用户的
count
设置为
1

处理完整个
userbuffer
数组后,可以使用
users
数组中的
count
值查看谁的请求最多。您可以手动迭代以查找最大值,也可以使用
qsort

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

编辑: 要对
用户
数组进行qsort,您需要定义一个简单的函数,qsort可以使用该函数进行排序。在本例中,类似这样的操作应该有效:

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;
}

一个地图是按键排序的,不是按值排序的。@ Guillaume Lebourgeois,我想我的大脑暂时不工作:D谢谢。问题是标记C,不是C++。因为马拉弗说他有点生锈,而且在20年内没有编码,我猜他可以欣赏C++答案,而且在C中没有约束。……是的,这很容易在C中得到,这得益于QSORTE()。图书馆职能。一个更快的选择是使用哈希表,但它需要更多的工作(除非您使用第三方库)。我在这里感到很困惑。你有一个代码片段可以做到这一点吗?他会不会不只是让用户拥有max count。让用户按优先级排在列表的第二位怎么样?他将不得不再次迭代。我想这是可以避免的。请看我问题的编辑。我试着使用qsort,但它并没有真正起作用。实际上,它正在崩溃。它崩溃的原因可能有几个。仅仅凭声明是不可能猜测的。请粘贴一些代码。我的意思是,在任何给定的时间,数组可能会被部分、全部或不完全填充,我用正确的数据(john=4、paul=2、james=1等)填充结构。我正在尝试qsort()它,但我遇到了麻烦。如何检查该结构[]上的最大值(如果有)。计数?谢谢,我实际上是通过比较计数并在结构中保存该数字和索引,然后在循环结束时对它们进行雕刻来完成的。谢谢你的帮助!
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(users, 150, sizeof(struct user), compare_users);