问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

生日相同问题,C语言编程,用字典结构解决,求解啊速度~~~

发布网友 发布时间:2022-05-10 09:04

我来回答

3个回答

懂视网 时间:2022-05-10 13:25

字典:

也叫散列表,最大的特点是通过key来查找其对应的值其时间复杂度是O(1).

在Python中怎样用列表实现字典?

用列表实现字典最大的问题就是解决hash冲突,如果在列表中通过计算不同的key得到相同的相同了位置,这时候应该怎么办?

最简单的办法就是使用拉链法.

详解拉链法实现字典的示例

拉链法:就是在一个列表中每个位置再添加一个列表,这样就算是有hash冲突也能够存储进去,当选取的hash函数足够好,

num的数足够大,就能够保证列表中的每一个列表里面只有一个元素。根据key计算的元素所在的位置,然后来取值就能达

到O(1)的时间。

class MyDict:
 def __init__(self, num=100): # 指定列表大小
 self._num = num
 self._lst = []
 for _ in range(self._num):
  self._lst.append([])

 def update(self, key, value): # 添加 key-value
 key_index = hash(key) % self._num
 for i, (k, v) in enumerate(self._lst[key_index]):
  if key == k:
  self._lst[key_index][i] = [key, value]
  break
 else:
  self._lst[key_index].append([key, value])

 def get(self, key): # 根据指定的 key 弹出值
 key_index = hash(key) % self._num
 for k, v in self._lst[key_index]:
  if k == key:
  return v
 else:
  raise KeyError('No such {} key'.format(key))

 def pop(self, key): # 根据 key 弹出元素 并且删除
 key_index = hash(key) % self._num
 for i, (k, v) in enumerate(self._lst[key_index]):
  if k == key:
  result = v
  self._lst.pop[self._num](i)
  return result
 else:
  raise KeyError('No such {} key'.format(key))

 def __getitem__(self, key): # 可以通过下标来取值
 key_index = hash(key) % self._num
 for k, v in self._lst[key_index]:
  if k == key:
  return v
 else:
  raise KeyError('No such {} key'.format(key))

 def keys(self): # 取得所有的key
 for index in range(self._num):
  for k, v in self._lst[index]:
  yield k

 def values(self): # 取得所有的 value
 for index in range(self._num):
  for k, v in self._lst[index]:
  yield v

 def items(self): # 取得所有的条目
 for index in range(self._num):
  for item in self._lst[index]:
  yield item

通过key查到的时间,可见下图

详解拉链法实现字典的示例

热心网友 时间:2022-05-10 10:33

楼主要求用C,麻烦呢,如果用C++倒是方便多了,闲着没事做,简单写了下,看下就好


#include <iostream>
#include <map>
#include <list>
#include <string>
using namespace std;
struct BirthInfo
{
    int month;
    int day;
    BirthInfo()
    {
        month = 0;
        day = 0;
    }
    bool operator == (const BirthInfo& rhs ) const
    {
        if ( month == rhs.month && day == rhs.day )
        {
            return true;
        }
        return false;
    }
    bool operator < (const BirthInfo& rhs ) const
    {
        if ( month < rhs.month )
        {
            return true;
        }
        else if ( month == rhs.month )
        {
            if ( day < rhs.day )
            {
                return true;
            }
        }
        return false;
    }
};
struct SameBirthInfo
{
    int nCount;
    list<string> StrNoList;
    SameBirthInfo()
    {
        nCount = 0;
    }
};
typedef map<BirthInfo , SameBirthInfo> Result;
int main()
{
    int nStudentCount = 0;
    string strNo = "";
    BirthInfo BirInfo;
    Result result;
    SameBirthInfo sameBirthInfo;
    cin >> nStudentCount;
    while( nStudentCount -- > 0 )
    {
        cin >> strNo >> BirInfo.month >> BirInfo.day;
        Result::iterator iter = result.find( BirInfo );
        if ( iter == result.end() )
        {
            //找不到
            pair<Result::iterator , bool> pInsRet = result.insert( Result::value_type(BirInfo,sameBirthInfo) );
            if ( pInsRet.second )
            {
                pInsRet.first->second.nCount = 1;    //记录下此生日有一人
                pInsRet.first->second.StrNoList.push_back( strNo );  //记录下此人学号
            }
        }
        else
        {
            //找到
            iter->second.nCount++;   //同一天生日人数++
            iter->second.StrNoList.push_back( strNo );   //保存下这个学生的学号
        }
    }
    //输出所有结果
    Result::const_iterator cIter = result.begin();
    while ( cIter != result.end() )
    {
        //先输出生日
        cout << cIter->first.month << " " << cIter->first.day;
        //输出所有学生学号
        list<string>::const_iterator cStrIter = cIter->second.StrNoList.begin();
        while ( cStrIter != cIter->second.StrNoList.end() )
        {
            cout << " " << cStrIter->c_str();
            ++cStrIter;
        }
        cout << endl;
        ++cIter;
    }
    return 0;
}

追问Σ( ° △ °|||)︴ 太...太厉害,只是窝一弱渣,看不懂C++...
能麻烦说说使用什么结构么?是顺序查找字典么?

追答用的其实就是map字典,我把学生的生日(月和日)作为一个查找键,找不到,就插入新的,找到了,就更新该键对应下面的学生信息

至于为什么要弄一个nCount来保存个数,方便你说的要求选中三个以上什么的而已,呵呵~

热心网友 时间:2022-05-10 11:51

字典是一种固定索引方式。对应的C++里的数据结构是map,两个或者两个以上键值对中选择一个作为索引表,通过索引获得对应的其它键值。就是把数组的数字索引换成了数据的某个键值,不过索引键值要求是唯一的。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
夫妻养狗狗把谁当主人 两人同养狗认谁当主人 什么蔬菜和水果可以美容祛斑呢? vivox60怎么查看参数配置详情 怎样查看vivo手机的屏幕参数? vivo手机怎么看手机参数 vi##手机怎么看配置? 义乌到湖州没有直达快客???必须到南浔?? 湖州到绍兴的汽车有几班? 注销驾考需要本人吗 民生保险为何没有排名 民生保险是民生银行的吗是否靠谱 现在胃消化不良?请问可以吃煮熟的洋葱吗?会不会有影响呢? 英语达人帮忙手工翻译几段话(中译英) 有大神尝试过使用云计算进行fluent计算的吗 fluent有没有类似云计算的功能? 微信公众号发视频,发网上自己下载的视频可以吗 怎么管理手机里的数据? 华为鸿蒙系统不能玩韩服dnf吗 鸿蒙系统可以玩dnf韩服吗 华为鸿蒙玩不了地下城 太宰治的“治”用日文怎么念? 太宰治的“尽管放马过来就怕你们没有这个本事”日语的谐音怎么说? 太宰治的人间失格中有一句:所谓世人不就是你吗?求日语原文 浮萍人生似水流,何苦愁闷川边柳。的日语原句? 求太宰治&lt;&lt;斜阳&gt;&gt;中“幸福感就是沉入悲哀之河河底闪着微光的金砂”这段话的日文原文 就是你吗?妨碍我投河的家伙,算了,我的名字叫太宰,太宰治,翻译日语平假名 太宰治最后一句话“不要绝望,在此告辞”的是什么意思? 求 大宰治这段话的出处和日文原文 求太宰治《斜阳》中 我心中的火焰是您点燃的,所以也请您来熄灭它 日文原文 皖事通登记过了子女怎么查不到 &#47;招商银行e招贷突然没了,怎么回事?信用卡没有逾期过,e招贷的额度还有48000,人早上看3万, VBA代码示例:字典匹配 yy开播自己录制视频没有声音 笔记本电脑电池的使用 关于python字典示例中person = people.get(name,{})报错 在意大利的复活节有什么活动啊? 复活节是哪个国家的节日? C#泛型集合、字典型集合,示例。教程。 花钱在51CTO上培训考PMP值得吗? pmp有必要考吗 上海电工操作证网上查询网址 上海特种作业查询系统 上海市应急管理局特种作业证件查询 仿照示例写一首小诗。 海是水的一部字典 浪花是部首 涛声是音序 鱼虾、海鸥是海的文字 剪纸工人要剪60张纸,已经剪好12张,剩下的要6天剪完,平均每天剪多少张? 小光发现剪纸工人为了省工,通常将纸折成多层,一刀多张。如果想剪出如 剪纸工人易得哪些病 DIY剪纸吧 我想雇佣工人刺绣的合同书