一句python两句R:贪心算法简单案例(暨 R语言在for循环中调用字典的方法)

Posted 基督徒Isaac

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一句python两句R:贪心算法简单案例(暨 R语言在for循环中调用字典的方法)相关的知识,希望对你有一定的参考价值。

标题模仿:
https://blog.csdn.net/sinat_26917383/article/details/52289476
python代码摘抄:
https://blog.csdn.net/hwl19951007/article/details/88957967

  1. 案例
    有abcd四个字母,需要被选出,
    有k1:ab;k2:bc;k3:cd;k4:bcd 四种方案,
    用最少的几种方案组合,把四个字母都选出来。
  2. Python代码

Python的字典在for循环中好好用啊
(台词via虾君:爷爷奶油面包好好吃)

needed = set(["a", "b", "c", "d"]) # 传入一个数组,被转换为集合
 
knum = 
knum["k1"] = set(["a", "b"])
knum["k2"] = set(["b", "c"])
knum["k3"] = set(["c", "d"])
knum["k4"] = set(["a", "b","c"])
 
final = set() # 使用一个集合来存储最终选择的方案
 
while needed:
    best = None # 将覆盖了最多的needed的方案存储进去
    max_covered = set() # 一个集合,包含该次循环中覆盖的最多needed
    
    for k, value in knum.items(): # 循环迭代每个方案并确定它是否是最佳的方案
        covered = needed & value # 计算交集
        if len(covered) > len(max_covered): # 检查该方案的覆盖范围是否比上一个多
            best = k # 如果多,就将该方案设置为best
            max_covered = covered
    # 在for循环遍历完所有方案以后,找到本次best
    needed -= max_covered # 更新needed
    final.add(best) # 在for循环结束后将best添加到最终的广播台列表中
    print(final) # 每次for循环结束打印本轮final方案
  1. R语言代码

R语言可以用list代替字典,
在for循环中选出 键名 in names(list)
list[[键名]] 提取对应的键值。

也可以用hash包的hash()生成字典
再用基础的names()或hash包的keys()提取键名。

有点麻烦哦,但是是可以实现的。
R语言中实现Python的set集合(即不重复集合),可以对向量使用unique()代替。

library(tidyverse)
needed <- letters[1:4] %>% unique
knum <- list(k1 = letters[1:2] %>% unique,
             k2 = letters[2:3] %>% unique,
             k3 = letters[3:4] %>% unique,
             k4 = letters[1:3] %>% unique)
final <- c() # 剔除重复项后的集合

while (length(needed) > 0) 
  best <- c()
  max_covered <- c() # 该次循环覆盖最多needed的方案所覆盖的needed,剔除重复项后的集合
  for (k in names(knum)) 
    covered <- intersect(needed, knum[[k]])
    # 第2次循环开始,每个键值与之前保存的覆盖量比较
    if (length(covered) > length(max_covered)) 
      best <- k
      max_covered <- covered %>% unique
  # 在for循环遍历完所有names(knum)以后,找到本次best
  needed <- setdiff(needed, max_covered) %>% unique
  final <- final %>% append(best) %>% unique
  print(final)
  1. 结果

Python结果排序可能会不一样,R中则会按方案顺序给出最终输出。
例如本例中,Python的结果可能是

‘k4’
‘k3’, ‘k4’

而R语言的结果是

[1] “k4”
[1] “k4” “k3”

  1. 补充阅读

参考文献:《算法图解》P126页

想要了解更多关于R中的字典,可以查阅hash包
https://www.cnblogs.com/xlij1205/p/10917926.html

以上是关于一句python两句R:贪心算法简单案例(暨 R语言在for循环中调用字典的方法)的主要内容,如果未能解决你的问题,请参考以下文章

一句python两句R:贪心算法简单案例(暨 R语言在for循环中调用字典的方法)

一句python两句R:矩阵与向量的基本运算

一句python两句R:矩阵与向量的基本运算

一句python两句R:标量向量矩阵列表/字典的基本运算差异(持续更新中)

转载︱案例 基于贪心算法的特征选择

一个简单的文件操作练习