代码之家  ›  专栏  ›  技术社区  ›  Darren Tsai

减少部分排序

  •  2
  • Darren Tsai  · 技术社区  · 7 年前

    AS ?sort 说,如果争论 部分的 不为空,它将包含结果元素的索引,这些元素将通过部分排序放置在排序数组中的正确位置。你可以阅读 Argument “partial” of the sort function in R 细节。所以在这种情况下,我需要找到 最小的5个数字 在里面 x <- sample(1:100, 50) 然后

    sort(x, partial = 1:5)[1:5]
    

    更快

    sort(x)[1:5]
    

    但是,我怎么能找到 最大的5个数字 部分排序?直觉上,我尝试使用:

    sort(x, partial = 1:5, decreasing = T)
    

    但它得到

    sort.int出错(x,na.last=na.last,decreasing=decreasing,…): 不支持的部分排序选项

    因此,我的问题是如何实现 效率 在这种情况下。

    2 回复  |  直到 7 年前
        1
  •  6
  •   jogo    7 年前

    您可以从排序的向量中获取尾部:

    set.seed(42)
    x <- sample(1:100, 50)
    # sort(x, partial = 1:5)[1:5] ## head
    
    p <- length(x)+1 - (1:5) ## tail
    sort(x, partial = p)[p]
    

    如果需要,可以使用 rev()

        2
  •  4
  •   s_baldur    7 年前

    您仍然可以从速度提升中获益,比如(假设为数字数据):

    -sort(-x, partial = 1:5)[1:5]
    

    标杆管理:

    set.seed(3)
    x <- sample(1:100000, 500000, replace = TRUE)
    
    bench::mark(
      snoram = -sort(-x, partial = 1:5)[1:5],
      OP = sort(x, decreasing = TRUE)[1:5],
      sotos_check = x[order(x, decreasing = TRUE)][1:5],
      jogo = {p <- length(x) - 0:4; sort(x, partial = p)[p]}
    )
    # A tibble: 4 x 14
      expression       min     mean   median      max `itr/sec` mem_alloc  n_gc n_itr total_time result    memory             time     gc               
      <chr>       <bch:tm> <bch:tm> <bch:tm> <bch:tm>     <dbl> <bch:byt> <dbl> <int>   <bch:tm> <list>    <list>             <list>   <list>           
    1 snoram        6.87ms   7.77ms   7.43ms  15.04ms     129.     5.72MB     9    34      264ms <int [5]> <Rprofmem [3 x 3]> <bch:tm> <tibble [43 x 3]>
    2 OP            17.4ms  18.96ms  18.56ms  24.37ms      52.7    3.81MB     3    21      398ms <int [5]> <Rprofmem [2 x 3]> <bch:tm> <tibble [24 x 3]>
    3 sotos_check  14.65ms  17.07ms  16.48ms  25.58ms      58.6    3.81MB     4    23      393ms <int [5]> <Rprofmem [2 x 3]> <bch:tm> <tibble [27 x 3]>
    4 jogo          4.98ms   5.45ms   5.35ms   8.91ms     184.     3.81MB     6    37      201ms <int [5]> <Rprofmem [2 x 3]> <bch:tm> <tibble [43 x 3]>