社区首页 >问答首页 >使用散列查找anagram组并将字母表映射为随机数

使用散列查找anagram组并将字母表映射为随机数
EN

Code Review用户
提问于 2022-08-27 21:52:47
回答 1查看 143关注 0票数 2

我在用leetcode解决小组的Anagram问题。问题https://leetcode.com/problems/group-anagrams/的链接

下面是我写的代码

代码语言:javascript
代码运行次数:0
复制
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& inp) {
    
    if(inp.size() == 0)
        return vector<vector<string> > {{}};
    
   int count = 1;
    map<char, long long> alphaVal;
    for (char i = 'a'; i <= 'z'; i++) {

        alphaVal[i] = int(rand());
    }

    map<long long, vector<string> > prep;

    for (auto value : inp) {

        long long temp = 0;

        for (auto c_p : value) {

            temp += alphaVal[c_p];
        }
        //cout << "temp " << temp << endl;
        prep[temp].push_back(value);
    }
    
    vector < vector<string> > ans;
    for (auto it = prep.begin(); it != prep.end(); it++) {

        vector<string> temp;
        for (int i = 0; i < it->second.size(); i++) {

            //cout << it->second[i] << " ";
            temp.push_back(it->second[i]);
        }

        ans.push_back(temp);
    }
    
    return ans;
}
};

我有两个问题:

  1. 即使上面的解决方案有效,随机使用真的是一个好主意吗?
  2. 在此之前,我编写了一个逻辑来检查字符并存储字符串。map,vector > prep;for (auto : inp) { set temp;for (autoc_p: value) { temp.insert( c_p );}prep临时.push_back(值);}

对于上述逻辑,有一个测试用例失败

代码语言:javascript
代码运行次数:0
复制
ip: ["ddddddddddg","dgggggggggg"]
op: [["ddddddddddg","dgggggggggg"]]

尽管这两个字符串是唯一的,但set哈希计算表明它是相同的。知道为什么在所选的测试用例上出现这种行为吗?只是好奇地想知道。谢谢你的回答!

EN

回答 1

Code Review用户

回答已采纳

发布于 2022-08-27 22:37:56

回答你的问题

即使上面的解决方案有效,随机使用真的是一个好主意吗?

这不是个好主意。它不能保证一个正确的结果。要在较高级别上解释代码:

  • 将随机的long long值赋给字母表
  • 对于输入中的每个单词
    • 字母的随机值之和
    • 由于字谜将具有相同的和,所以将单词按和分组。

这种做法存在缺陷,因为:

  • 不是字谜的词也可能有相同的和。由于随机性带来的一些坏运气,单词可能会被错误地分配到同一个桶中。
  • 虽然long long是一个很大的范围,但可能不止一个字母被分配相同的随机数。这将大大增加碰撞的风险。

要正确地分组字谜,分组键必须清楚地标识字谜,并且不能被不应该在同一组中的单词所共享。这个独特的键可以是字母计数的地图:

代码语言:javascript
代码运行次数:0
复制
map<map<char, int>, vector<string>> counts2words;

for (auto word : words) {
    map<char, int> counts;
    for (auto c : word) {
        counts[c]++;
    }
    counts2words[counts].push_back(word);
}

尽管这两个字符串是唯一的,但set哈希计算表明它是相同的。知道为什么在所选的测试用例上出现这种行为吗?

首先,这一说法具有误导性。在这个例子中,比散列计算更多的是相同的,这里两个集合本身是相同的,由字母"d“和"g”组成。

但是让我们假设两个字符串S1和S2的哈希计算是相同的。这并不奇怪,这就是散列函数的工作方式。冲突会发生,这就是为什么在处理散列时,当哈希值相等时,您还必须比较未散列的值,以验证它们是否真的相等。

使用描述性名称

整个实现过程中使用的名称都很神秘。参见上面的示例代码,其中我使用了一个计数图:所有东西都有一个描述性名称,除了字母的琐碎的c

删除不必要的输入验证

这是不必要的:

如果(inp.size() == 0)返回vector >{{};

首先,问题描述保证输入绝不是空的。

另一方面,实现自然地正确处理空输入的情况。

票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/279220

复制
相关文章
散列查找和哈希查找_散列检索
散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。建立了关键字与存储位置的映射关系,公式如下:
全栈程序员站长
2022/11/15
8990
查找-散列查找
散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。查找时,根据这个确定的对应关系找到给定值key的映射f(key),若查找集合中存在这个记录,则必定在f(key)的位置上。
全栈程序员站长
2022/08/28
1.4K0
查找-散列查找
散列查找
散列同顺序、链接和索引一样,是又一种数据存储方法。散列存储的方法是:以数据集合中的每个元素的关键字k为自变量,通过一种函数h(k)计算出函数值,把这个值用做一块连续存储空间(即数组或文件空间)中的元素存储位置(即下标),将该元素存储到这个下标位置上。散列存储中使用的函数h(k)被称为散列函数或哈希函数,它实现关键字到存储位置(地址)的映射(或称转换),h(k)被称为散列地址或哈希地址;使用的数组或文件空间是对数据集合进行散列存储的地址空间,所以被称为散列表或哈希表。在散列表上进行查找时,首先根据给定的关键字k,用与散列存储时使用的同一散列函数h(k)计算出散列地址,然后按此地址从散列表中取出对应的元素。
全栈程序员站长
2022/08/27
1.2K0
散列查找
【说站】python哈希散列的映射
以上就是python哈希散列的映射,希望对大家有所帮助。更多Python学习指路:python基础教程
很酷的站长
2022/11/23
7460
【说站】python哈希散列的映射
数据结构:图文详解 - 动态查找、静态查找、散列查找
对于二分查找存在一定的优 & 缺点,所以衍生出2种二分查找的变式方法:插值查找 & 斐波那契查找。具体如下:
Carson.Ho
2020/09/24
2.5K0
数据结构:图文详解 - 动态查找、静态查找、散列查找
Python 算法基础篇之散列查找算法:哈希表、哈希集合、哈希映射
散列查找算法是一种高效的查找技术,通过散列函数将键映射到数组的索引位置,实现快速的查找、插入和删除操作。本篇博客将介绍散列查找算法的三种常见应用:哈希表、哈希集合和哈希映射,并通过实例代码演示它们的应用。
小蓝枣
2023/07/24
3470
OJ刷题记录:散列查找实验
题目描述: 请设计一个整型闭散列表,散列函数为除留余数法,处理冲突时的探查方法为线性探查法,其中散列表的长度、除留余数法的模和关键码的个数由键盘输入,再根据输入由键盘输入所有的关键码。分别对三个待查值在散列表中进行查找,如果找到了输出位置,如果没找到,输出“none”并把该待查值插入到散列表中,如果散列表满输出“full”。
英雄爱吃土豆片
2020/11/12
5780
散列/散列函数「建议收藏」
每个关键字被映射到从0-TableSize-1这个范围中的某个数,并且被放到适当的单元中。这种映射就叫做散列函数
全栈程序员站长
2022/08/28
8920
散列/散列函数「建议收藏」
散列算法与散列码
一、引入 1 /** 2 * Description:新建一个类作为map的key 3 */ 4 public class Groundhog 5 { 6 protected int number; 7 8 public Groundhog(){ 9 } 10 public Groundhog(int number) 11 { 12 this.number = number; 13 } 14 15 @Overr
JMCui
2018/03/15
1.5K0
散列算法与散列码
散列
将一个元素的关键码和存储位置之间建立对应的函数关系 Hash( ), 使得每个关键码与结构中的唯一的存储位置相对应:
Rikka
2022/02/07
1.8K0
散列
选择键值,冲突的时候采取不同的策略 散列函数: 简单的散列函数: 1 int hash(const string & key,int tableSize) 2 { 3 int hashVal = 0; 4 for(int i = 0; i < key.length();++i) 5 { 6 hashVal + = key[i]; 7 } 8 return hashVal % tableSize; 9 } 比较好的散列函数: 1 int hash( c
用户1154259
2018/01/17
8140
DS哈希查找—二次探测再散列
定义哈希函数为H(key) = key%11。输入表长(大于、等于11),输入关键字集合,用二次探测再散列构建哈希表,并查找给定关键字。
叶茂林
2023/07/30
2770
分离链接的散列散列代码实现
散列 散列为一种用于以常数平均时间执行插入,删除和查找的技术。一般的实现方法是使通过数据的关键字可以计算出该数据所在散列中的位置,类似于Python中的字典。关于散列需要解决以下问题: 散列的关键字如何映射为一个数(索引)——散列函数 当两个关键字的散列函数结果相同时,如何解决——冲突 散列函数 散列函数为关键字->索引的函数,常用的关键字为字符串,则需要一个字符串->整数的映射关系,常见的三种散列函数为: ASCII码累加(简单) 计算前三个字符的加权和$\sum key[i] * 27^{i}$ (不太
月见樽
2018/04/27
1.5K0
Carson带你学数据结构:图文详解 - 动态查找、静态查找、散列查找
对于二分查找存在一定的优 & 缺点,所以衍生出2种二分查找的变式方法:插值查找 & 斐波那契查找。具体如下:
Carson.Ho
2022/03/25
5400
Carson带你学数据结构:图文详解 - 动态查找、静态查找、散列查找
DS哈希查找—二次探测再散列
定义哈希函数为H(key) = key%11。输入表长(大于、等于11),输入关键字集合,用二次探测再散列构建哈希表,并查找给定关键字。
全栈程序员站长
2022/08/28
4810
4 整型关键字的散列映射 (25分)
给定一系列整型关键字和素数P,用除留余数法定义的散列函数将关键字映射到长度为P的散列表中。用线性探测法解决冲突。
韩旭051
2020/06/23
8950
Hash散列[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/146553.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/27
6720
散列冲突
概念:如果当一个元素被插入时与一个已经插入的元素散列到相同的值, 那么就会产生冲突, 这个冲突需要消除。解决这种冲突的方法有几种:本章介绍两种方法:分离链接法和开放定址法
全栈程序员站长
2022/08/27
5950
散列函数
散列的概念属于查找,它不以关键字的比较为基本操作,采用直接寻址技术。在理想情况下,查找的期望时间为O(1)。
233333
2019/09/24
9200
Hash(散列)冲突解决 线性探测再散列和二次探测再散列
例如  哈希函数为: H(key) =  key %13,key 为关键字,采用开放地址法中的线性探测再散列解决冲突,依次输入
用户2965768
2018/12/28
16.6K0

相似问题

包含用于查找的散列映射的Java枚举

60

根据散列数据在散列中查找条目

10

使用树的基本纯Python散列映射

10

F#中的Anagram查找器

10

anagram查找器的单元测试

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档