【问题标题】:Sorting with tie-breaking that minimizes disconinuity of a boolean field使用平局进行排序,最大限度地减少布尔字段的不连续性
【发布时间】:2013-11-17 22:12:24
【问题描述】:

D 成为一个data.frame,其中D$x 包含实数,D$y 包含布尔值等字段。

问题是对D 的行进行排序,以使D$x 不递减,同时以最小化结果D$y 中的不连续数量的方式打破平局。

在 R 中是否有一种简单快速的方法来完成此任务?

更多信息

在像 C 这样的语言中,我会首先按 x 排序,然后使用 2 态 FSM 依次传递结果,以尽可能消除不连续性。但在 R 中,如果有数千行需要按顺序处理,我预计迭代会带来不必要的开销。

正确结果示例:

D$x  D$y
1    FALSE
1    FALSE
1    TRUE
1    TRUE
1.2  TRUE
1.5  TRUE
1.5  FALSE

错误结果示例:

D$x  D$y
1    TRUE
1    FALSE
1    TRUE
1    FALSE
1.2  TRUE
1.5  FALSE
1.5  TRUE

在示例中,正确的结果有 2 个不连续点,而错误的结果有 6 个。

编辑:我们可以假设数据使得结果中的不连续性密度很低:例如,每 1000 行少于 1 个不连续性。

【问题讨论】:

  • 当您说最小化时,您是指优化意义上的吗?还是有“足够好”的结果?
  • 我认为不可能在不到 2 次的时间内完成此操作,因为您不知道元素在排序后最终会靠近哪里。
  • @Ricardo 如果通过优化,您的意思是最小化,那么是的 :) D$y 上的排序顺序应该反转 x 的那些值,其中连续性将从所述反转中受益。跨度>

标签: r performance algorithm stable-sort


【解决方案1】:

比顺序迭代更快的解决方案(如果不连续性稀疏):

sortForMaxContY <- function(D,initialY){
    n <- nrow(D)
    D <- D[order(D$x),]

    xChanges <- D$x[-1]!=D$x[-n]
    isLastOfXVal <- c(xChanges,T)
    rankOfXVal <- cumsum(c(T,xChanges))

    oldFinalYs <- NA
    finalYs <- D$y[isLastOfXVal]
    while(!identical(finalYs,oldFinalYs)){
        finalYOfPrecedingXVal <- c(initialY,finalYs)[rankOfXVal]
        oldFinalYs <- finalYs
        D <- D[order(D$x,xor(finalYOfPrecedingXVal,D$y)),]
        finalYs <- D$y[isLastOfXVal]
    }
    return(D)
}

sortForMaxContY(D,T)sortForMaxContY(D,F) 中的一个是最佳的,另一个通常也是,这取决于数据。

【讨论】:

    【解决方案2】:

    暴力破解:

    sortForMaxContY <- function(D,initialY){
        n <- nrow(D)
    
        D <- D[order(D$x),]
    
        x <- c(D$x,Inf)
        whichT <- c(which(D$y),n+1)
        whichF <- c(which(!D$y),n+1)
    
        finalOrder <- rep(0,n) # allocate space
        lastY <- initialY
        iT <- 1
        iF <- 1
        for(i in 1:n){
            wT <- whichT[iT]
            wF <- whichF[iF]
            chooseT <- sign(x[wF]-x[wT])+lastY-0.5>0
            w <- ifelse(chooseT, wT, wF)
            finalOrder[i] <- w
            lastY <- D$y[w]
            iT <- iT + chooseT
            iF <- iF + !chooseT
        }
    
        return(D[finalOrder,])
    }
    

    sortForMaxContY(D,T)sortForMaxContY(D,F) 中的一个是最佳的,另一个通常也是,这取决于数据。

    难道 R 没有办法更快地做到这一点吗?

    【讨论】:

      【解决方案3】:

      如果 y 有一个最佳的重新排列,这不会给你完美的结果,但否则会起作用

      D[order(D$x, D$y), ]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-05
        • 2010-10-18
        相关资源
        最近更新 更多