字符串到数字的映射

RyderL 2013-07-05 05:38:44
有没有什么办法可以把一组(n个)字符串映射到0 ~ n呢?不要那种字符串比较的东东~

举个简单例子:
有一组字符'8','9','7','6',如果我们建立以下映射的话,’6‘-1 ’7‘-2 ‘8’-3 ’9‘-4
对于以上的规则表,有两种方法查找这个规则表:
第一种:字符串比较
第二种:比如’8‘-’5‘ = 3
这个只是一种最简单的,如果这个对应列表复杂了以后,那这个对应算法就可以不是简单的一个减法能解决的了,但应该也是有一种数学方法能够解决这个问题的~我希望的就是这样的一个明确的计算方法

如果是随机的字符串数组,怎么样把他们按一定规则组建在一起形成一个规则表,来方便查询?

这个规则表是一次建立,超多次使用的
...全文
1687 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuna890804 2014-12-02
  • 打赏
  • 举报
回复
你怎么解决的呢
RyderL 2014-01-23
  • 打赏
  • 举报
回复
谢谢大家的帮忙,我找到了完美适配我需求的方法,有时候解决问题的方法可以有很多种,之前一直钻牛角尖了~
RyderL 2013-12-10
  • 打赏
  • 举报
回复
鉴于各位热心好友的帮助,现在再把我的需求再明确一下: 1、基于指定的有限字符集来构造各字符串 2、每个字符串为指定字符集的子集 3、字符串总数为指定数量(n) 对一组基于上数三条限制的字符串,将其对应到0 ~ n的整数集。
RyderL 2013-12-10
  • 打赏
  • 举报
回复
引用 16 楼 zhao4zhong1 的回复:
http://www.baidu.com/s?wd=%E6%9A%B4%E9%9B%AA+%E5%93%88%E5%B8%8C&rsv_bp=0&ch=&tn=baidu&bar=&rsv_spt=3&ie=utf-8&rsv_sug3=9&rsv_sug1=8&rsv_sug4=189&rsv_n=2&inputT=9906
仔细看了一下康托展开,这个和我的需求还是有一定的差别,对于一个字符集,这个排列的数量是有限的,而且是不可变的,而且这个字符串必须是字符集的一个排列而非一个子集,这个限制有点太强,使用时不太灵活,而我希望的是可以根据我的字符串的数量来来决定这个映射的关系。
RyderL 2013-12-03
  • 打赏
  • 举报
回复
引用 14 楼 nice_cxf 的回复:
显然是不可能完成的任务,就是所谓的完美hash函数:不会冲突,并且没有浪费空间,这怎么可能存在。。。
完美那是不太可能,我们退而求其次吧,但如果在一些限制条件下,这样的hash也许是可以做的,比如对每个字符串做一些限制,比如长度一定、字符集也加限制等等
nice_cxf 2013-12-03
  • 打赏
  • 举报
回复
显然是不可能完成的任务,就是所谓的完美hash函数:不会冲突,并且没有浪费空间,这怎么可能存在。。。
RyderL 2013-12-03
  • 打赏
  • 举报
回复
引用 12 楼 zhao4zhong1 的回复:
不要重复制造轮子
不应该算是重复制造吧,目前我能找到的没有满足要求的,uuuououlcz提到的“康托展开”目前还没看完,不知道能不能用
RyderL 2013-12-02
  • 打赏
  • 举报
回复
引用 7 楼 baichi4141 的回复:
楼主所想的办法就是hash
也对,但Hash的特征值的算法也有很多种的,目前这些算法好像都会有我上面提到的那三点问题
baichi4141 2013-12-02
  • 打赏
  • 举报
回复
楼主所想的办法就是hash
RyderL 2013-12-02
  • 打赏
  • 举报
回复
引用 3 楼 Emiyasstar__ 的回复:
map,hash_map
Hash表有一个麻烦的问题是重码,这个在这里还是不希望发生的
RyderL 2013-12-02
  • 打赏
  • 举报
回复
引用 4 楼 gfenlan 的回复:
[quote=引用 3 楼 Emiyasstar__ 的回复:] map,hash_map
应该是map的一种,但hash_map表具体怎么建也应该是有讲究的 这个是在这样一种前提下使用的: 有n个字符串(这个n是一个确定的,不会再变的,每个字符串都不会相同,这个表是一次建立,超多次使用),他们是以链表的形式存放的,在字符串查找时,如果直接用链接枚举的话,那如果n很大,这个时间复杂度太高。 可是如果我把这个表按每个字符串的一种特征整理一次,存储到一个数组中,在以后每次使用时直接用这个特征找到相应的数组位置并取值,这将会是一种极高效的处理方法。 这里有两个要求:1、这个特征的计算必须是以n为参数的,所以特征值最大只能为n-1 2、特征的计算时间复杂度不能太高,如果时间复杂度过高的话,就没有使用的意义了 [/quote] sorry,不知道那个小贱图是怎么加上去的~
RyderL 2013-12-02
  • 打赏
  • 举报
回复
引用 3 楼 Emiyasstar__ 的回复:
map,hash_map
应该是map的一种,但hash_map表具体怎么建也应该是有讲究的 这个是在这样一种前提下使用的: 有n个字符串(这个n是一个确定的,不会再变的,每个字符串都不会相同,这个表是一次建立,超多次使用),他们是以链表的形式存放的,在字符串查找时,如果直接用链接枚举的话,那如果n很大,这个时间复杂度太高。 可是如果我把这个表按每个字符串的一种特征整理一次,存储到一个数组中,在以后每次使用时直接用这个特征找到相应的数组位置并取值,这将会是一种极高效的处理方法。 这里有两个要求:1、这个特征的计算必须是以n为参数的,所以特征值最大只能为n-1 2、特征的计算时间复杂度不能太高,如果时间复杂度过高的话,就没有使用的意义了
赵4老师 2013-12-02
  • 打赏
  • 举报
回复
不要重复制造轮子
还有多远 2013-12-02
  • 打赏
  • 举报
回复
搜索“康托展开”
RyderL 2013-12-02
  • 打赏
  • 举报
回复
引用 9 楼 baichi4141 的回复:
[quote=引用 8 楼 gfenlan 的回复:] [quote=引用 7 楼 baichi4141 的回复:] 楼主所想的办法就是hash
也对,但Hash的特征值的算法也有很多种的,目前这些算法好像都会有我上面提到的那三点问题[/quote] 就是说楼主需要一个目前不存在的hash算法[/quote] 我找了一下目前的算法,也自己想了一下,没想好怎么设计~
baichi4141 2013-12-02
  • 打赏
  • 举报
回复
引用 8 楼 gfenlan 的回复:
[quote=引用 7 楼 baichi4141 的回复:] 楼主所想的办法就是hash
也对,但Hash的特征值的算法也有很多种的,目前这些算法好像都会有我上面提到的那三点问题[/quote] 就是说楼主需要一个目前不存在的hash算法
Emiyasstar__ 2013-07-05
  • 打赏
  • 举报
回复
map,hash_map
图灵狗 2013-07-05
  • 打赏
  • 举报
回复
参考http://baike.baidu.com/view/329976.htm
引用 楼主 gfenlan 的回复:
有没有什么办法可以把一组(n个)字符串映射到0 ~ n呢?不要那种字符串比较的东东~ 举个简单例子: 有一组字符'8','9','7','6',如果我们建立以下映射的话,’6‘-1 ’7‘-2 ‘8’-3 ’9‘-4 对于以上的规则表,有两种方法查找这个规则表: 第一种:字符串比较 第二种:比如’8‘-’5‘ = 3 这个只是一种最简单的,如果这个对应列表复杂了以后,那这个对应算法就可以不是简单的一个减法能解决的了,但应该也是有一种数学方法能够解决这个问题的~我希望的就是这样的一个明确的计算方法 如果是随机的字符串数组,怎么样把他们按一定规则组建在一起形成一个规则表,来方便查询? 这个规则表是一次建立,超多次使用的
赵4老师 2013-07-05
  • 打赏
  • 举报
回复
仅供参考
#pragma warning(disable:4786)
#include <iostream>
#include <string>
#include <map>
using namespace std;
int main () {
    wstring ws1,ws2;

    wcin.imbue(locale("chs"));
    wcout.imbue(locale("chs"));
    getline(wcin,ws1);
    getline(wcin,ws2);
    if (ws1.size()!=ws2.size()) {
        wcout<<ws1<<L" 和 "<<ws2<<L" 不对应"<<endl;
        return 1;
    }

    map<wchar_t,wchar_t> m1,m2;
    int n=ws1.size();

    for (int i=0;i<n;i++) {
        if (m1.find(ws1[i])==m1.end() && m2.find(ws2[i])==m2.end()) {
            m1[ws1[i]]=ws2[i];
            m2[ws2[i]]=ws1[i];
        } else {
            if (m1[ws1[i]]!=ws2[i] || m2[ws2[i]]!=ws1[i]) {
                wcout<<ws1<<L" 和 "<<ws2<<L" 不对应"<<endl;
                return 1;
            }
        }
    }
    wcout<<ws1<<L" 和 "<<ws2<<L" 对应"<<endl;
    return 0;
}

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧