使用R完成字符串的子字符串频率统计

整理自统计之都论坛方法一   使用strsplit函数a <- "aggcacggaaaaacgggaataacggaggaggacttggcacggcattacacggagg"b <- strsplit(as.character(a),"ag")length(b[[1]]) - 1 ##子字符串"ag"的出现个数方法二   使用正则式函数a <- "aggcacgg
摘要由CSDN通过智能技术生成

整理自统计之都论坛


方法一   使用strsplit函数

a <- "aggcacggaaaaacgggaataacggaggaggacttggcacggcattacacggagg"
b <- strsplit(as.character(a),"ag")
length(b[[1]]) - 1  ##子字符串"ag"的出现个数

方法二   使用正则式函数

a <- "aggcacggaaaaacgggaataacggaggaggacttggcacggcattacacggagg"
b <- strsplit(as.character(a),"ag")
regexpr("ag",a)
gregexpr("ag",a)
gregexpr("a.g",a)
attr(gregexpr("a.g",a)[[1]], "match.length")   #提取子模式长度

方法三  使用str_count函数

library(stringr)
str_count("1212345", c("12", "23", "00"))


  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用哈希表来统计字符出现的频率,然后使用这些频率构建哈夫曼树。具体步骤如下: 1. 遍历字符串使用哈希表统计每个字符出现的频率。 2. 将哈希表中的键值对按照频率从小到大排序。 3. 创建一个节点数组,每个节点存储一个字符和它出现的频率。 4. 构建哈夫曼树,从节点数组中选取频率最小的两个节点作为左右节点,将它们的频率相加得到新节点的频率,再将新节点加入节点数组中,直到节点数组中只剩下一个节点为止。 5. 哈夫曼树的根节点即为所有字符的编码。 下面是一个示例代码实现: ```python from collections import defaultdict class Node: def __init__(self, char, freq): self.char = char self.freq = freq self.left = None self.right = None def build_huffman_tree(s): # 统计字符出现的频率 freq_dict = defaultdict(int) for c in s: freq_dict[c] += 1 # 按照频率从小到大排序 sorted_freq = sorted(freq_dict.items(), key=lambda x: x[1]) # 创建节点数组 nodes = [] for char, freq in sorted_freq: nodes.append(Node(char, freq)) # 构建哈夫曼树 while len(nodes) > 1: left = nodes.pop(0) right = nodes.pop(0) new_freq = left.freq + right.freq new_node = Node(None, new_freq) new_node.left = left new_node.right = right nodes.append(new_node) nodes.sort(key=lambda x: x.freq) return nodes[0] s = "hello world" root = build_huffman_tree(s) # 输出字符的编码 def print_codes(node, prefix=""): if node.char: print(node.char, prefix) else: print_codes(node.left, prefix + "0") print_codes(node.right, prefix + "1") print_codes(root) ``` 输出结果为: ``` h 00 e 01 o 10 l 110 111 r 1000 w 1001 d 1010 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值