由“求两个字符串的并集的c语言程序?”想开去,实践课程
以下是引用hpjjiangmali在2012-8-28 04:56:37的发言:写一个函数将任意给定的两个字符串取并集
函数原型为:
char *bingji(char *s1,char *s2);
若s1: abcdde
s2: bcdfg
则返回的是 abcdefg
这个题目的求并集的字符最大长度 也只有255 个 ASCII 那么大
按照 两个字符STR1 STR 2
在加一个字符 STR3 存放 STR1+STR2的并集
从STR1取1字符放入 STR3中,让再要放进去的字符 一STR3中的字符进行比较 如果不同 放入 如果相同舍弃
就这样读完 对于现在计算机处理来说 速度上不是很大的问题,经过琢磨
提出 另外一种实现方法
1.建立一个255位 位段 位段里每一位二进制码 对应一个字符 以 0 代表这个字符没出现过 1代表这个字符出现过。起始初始化 为 二进制位全部为00000000000000000000000000000
对位的定位采用 位段基地址+ASCII(偏移地址) 来确定对应位的方式找出字符的段位地址。
段位的十进制 位映射 采取方式 字符对应位取1 其余 二进码 全部取0 后转换成十进制来表示
判定 此字符出现过没 ,采取 段位的十进制数 与 255个位 进行相与运算 结果为 000000000000000000000000000000000 表示 表示此位并未被设置 可以插入。 然后进行插入运算
这个算法实现 运算时间 上在这个问题处理上 要比上面的一个算法 在时间上 要慢
但是 如果 现在题目换成
对一个已存有的数据文件中,这个文件大到几个G 这个时候要处理的问题 是 统计字符的出现次数的时候 上面的算法实现 是要比下面的算法实现 效率要低的,道理和简单 统计一个字符 你就得 把几个G 的内容全部读完 然后遍历 255 字符确认字符的身份 这个题目 就可以把上面的算法改下就能满足要求了
用异或运算 来归0 用 或 运算来置 1
每统计一个数 就将 先进行 或 运算 置1 统计字符数增1 再进行 亦或 来置0
初始255个二进制位 全部 置0000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000100000000000 进行对应位运算
码表对应关系
混乱了 ,感觉没有意义的很哟 好像跟上面的一样 只是比对了不同的码表
哎,失败!!!!!!!!我在和自己玩 圈圈?