【问题标题】:what is the most efficient way to find the most common value in a vector?在向量中找到最常见值的最有效方法是什么?
【发布时间】:2020-01-28 21:44:35
【问题描述】:

我正在尝试创建一个函数来解决这个难题:

算术级数定义为给定数字序列的连续项之间存在恒定差异的级数。为您提供算术级数的连续元素。但是有一个问题:给你的一组数字中恰好缺少原始系列中的一个术语。给定系列的其余部分与原始 AP 相同。找出缺失的术语。

你必须编写函数 findMissing(list),list 总是至少有 3 个数字。缺少的词永远不会是第一个或最后一个。

下一段代码展示了我对这个函数的尝试。我所在的站点针对该函数运行测试,所有测试都通过了,因为它们输出了正确的缺失整数。

我面临的问题是它给了我一个超时错误,因为运行所有测试需要很长时间。有 102 个测试,据说完成它们需要超过 12 秒。耗时超过 12 秒意味着该功能不够高效。

在 RStudio 中运行我自己的计时测试后,运行该函数所需的时间似乎比 12 秒要少得多,但无论如何我需要提高效率才能完成难题。

我在网站论坛上问过,有人说“排序很贵,想想没有它的另一种方法。”我认为这意味着我不应该使用 sort() 函数。这是他们的意思吗?

我已经找到了几种不同的方法来获取使用 sort() 函数计算的 my_diff。所有这些方式都比原来的方式效率更低。

无论如何,能否给我一种更有效的方式来查找 my_diff 或让代码的其他部分更有效?虽然 sort() 部分显然是代码效率低下的部分。

find_missing <- function(sequence){


  len <- length(sequence)

  if(len > 3){
    my_diff <- as.integer(names(sort(table(diff(sequence)), decreasing = TRUE))[1])

    complete_seq <- seq(sequence[1], sequence[len], my_diff)
  }else{
    differences <- diff(sequence)
    complete_seq_1 <- seq(sequence[1],sequence[len],differences[1])
    complete_seq_2 <- seq(sequence[1],sequence[len],differences[2])
    if(length(complete_seq_1) == 4){
      complete_seq <- complete_seq_1
    }else{
      complete_seq <- complete_seq_2
    }
  }

  complete_seq[!complete_seq %in% sequence]

}

这里有几个示例序列来检查代码是否有效:

find_missing(c(1,3,5,9,11))
find_missing(c(1,5,7))

以下是我尝试过的其他一些事情,而不是排序:

1:

library(pracma)
Mode(diff(sequence))

2:

library(dplyr)
(data.frame(diff_1 = diff(sequence)) %>% 
  group_by(diff_1) %>%
  summarise(count = n()) %>%
  ungroup() %>%
  filter(count==max(count)))[1]

3:

MaxTable <- function(sequence, mult = FALSE) {

  differences <- diff(sequence)
  if (!is.factor(differences)) differences <- factor(differences)
  A <- tabulate(differences)
  if (isTRUE(mult)) {
    as.integer(levels(differences)[A == max(A)])
  } 
  else as.integer(levels(differences)[which.max(A)])
}

【问题讨论】:

    标签: r function sorting


    【解决方案1】:

    这是使用seq 执行此操作的一种方法。我们可以创建一个从序列中的最小值到序列中的最大值的序列,其长度为length(x) + 1,因为序列中恰好缺少一个术语。

    find_missing  <- function(x) {
      setdiff(seq(min(x), max(x), length.out = length(x) + 1), x)
    }
    
    find_missing(c(1,3,5,9,11))
    #[1] 7
    find_missing(c(1,5,7))
    #[1] 3
    

    【讨论】:

      【解决方案2】:

      这种方法采用向量的diff() - 总会有一个差异高于其他差异。

      find_missing <- function(x) {
        diffs <- diff(x)
        x[which.max(diffs)] + min(diffs)
      }
      
      find_missing(c(1,3,5,9,11))
      [1] 7
      find_missing(c(1,5,7))
      [1] 3
      

      【讨论】:

        【解决方案3】:

        实际上有一个简单的公式,即使你的向量没有排序,它也可以工作......

        find_missing <- function(x) {
           (length(x) + 1) * (min(x) + max(x))/2 - sum(x)
           }
        
        find_missing(c(1,5,7))
        [1] 3
        
        find_missing(c(1,3,5,9,11,13,15))
        [1] 7
        
        find_missing(c(2,8,6))
        [1] 4
        

        它基于这样一个事实,即全系列的总和应该是平均值乘以长度。

        【讨论】:

          猜你喜欢
          • 2019-10-20
          • 1970-01-01
          • 1970-01-01
          • 2018-05-23
          • 1970-01-01
          • 2013-06-26
          • 1970-01-01
          • 2011-10-04
          • 1970-01-01
          相关资源
          最近更新 更多