根据动态优先级显示结果的算法

标签 algorithm

我有一个很大的关系,其中每个元组都有一个对应于每一列的整数值。现在我需要根据用户指定的每一列的优先级(这显然会根据用户而变化)按顺序显示这些元组。微型示例: 考虑这种关系: enter image description here

用户为 A、B、C 和 D 输入的优先级分别为 8、9、5 和 4,我需要确定与用户优先级最匹配的元组的顺序。 到目前为止,我所想到的是按照提供的用户优先级的排序顺序应用过滤器,然后显示结果。我需要帮助以获得更准确的算法。

最佳答案

答案可能像...一样简单吗? 显然,这不是答案,但我仍然一头雾水,正确的结果可能是什么......

基本上,问题归结为“哪个指标最符合用户的口味?”。

虽然我自己提供了2个指标,但任何有想法的人都可以通过给出一个指标函数来缩短他们的答案。您可以尝试以下代码,例如 http://www.tryfsharp.org/Create

第一个(metric1 使用标量积)。 虽然第二个值很小,但优先级几乎相同的第一个值在排名中上升 (6,2,3,8)。

第二个 (metric2) 尝试与值无关,使用一些排名方法(排名在稳健估计器中,baysean,......)其中排序元组值相对位置的匹配排序后的优先级元组中的位置将获得一个数字 2^(优先级位置)作为奖励。这意味着,最高优先级排名中的匹配永远不会被较低优先级位置匹配击败。你还跟着,对吧? :)

为了进一步阐明 metric2(我相信它可以改进 - 当你需要它们时那些谷歌人在哪里?!):

[3; 2; 4; 1] [2; 1; 3; 4] ([1; 5; 9; 2] [8; 9; 5; 4])
0
[4; 1; 3; 2] [2; 1; 3; 4] ([6; 2; 3; 8] [8; 9; 5; 4])
12
[4; 3; 2; 1] [2; 1; 3; 4] ([4; 4; 4; 4] [8; 9; 5; 4])
0

在这里,您可以看到表中所有 3 个四元组的 metric2 的中间值。 在最右边,您会看到优先级值元组。右数第二个,输入值元组。前两个列表显示表元组和优先级元组的排序索引(按降序排列)。

现在...一个好的匹配将具有与优先级元组相同的排序顺序。 (这个度量理论)。因此,如果表元组中的最大值位于优先级元组中最高优先级所在的位置,这会很好。对于优先级元组中的高优先级位置,这甚至更好。如果表元组中的第二高值位于优先级元组中第二高优先级值的位置,这也很好 - 但不如最高优先级上的第一个值重要......

为了避免根据优先级元组对元组中“最不重要”值的排序胜过更“重要”的值,我向指标添加了一个优先级特定值。

如果第一个优先级匹配,则其度量值为 2^4 = 16。如果第二个匹配,则为 8,则为 4,2,1。因此,即使第一个匹配失败并且所有其他匹配都匹配,一个元组也无法击败第一个位于正确位置的元组。

为了方便研究人员,我添加了一个空的 metric3,可用于寻找更好的替代方案。

let ua,ub,uc,ud = (8,9,5,4)
let table = [ 1,5,9,2; 6,2,3,8; 4,4,4,4 ]
let metric1 (a,b,c,d) = a*ua + b * ub + c * uc + d * ud
let metric2 (a,b,c,d) = 
    let indices = [1;2;3;4]
    let values = [a;b;c;d]
    let indByValue  = 
        List.zip indices values 
        |> List.sortBy (fun (i,v) -> v)  
        |> List.map (fun (i,v) -> i) 
        |> List.rev
    let prioIndByValue = 
        List.zip indices [ua;ub;uc;ud] 
        |> List.sortBy (fun (i,p) -> p) 
        |> List.map (fun (i,p) -> i) 
        |> List.rev
    //printfn "%A %A (%A %A)" indByValue prioIndByValue values [ua;ub;uc;ud]
    let r,_ = 
        List.zip indByValue prioIndByValue 
        |> List.fold (fun (cnt,w) (x,y)-> if x = y then (cnt + (1 <<< w),w-1) else (cnt,w-1) ) (0,4)
    r
let metric3 (a,b,c,d) = 
    // TODO: Write your favourite metric here ;)
    0
let best1 = List.maxBy metric1 table
let sorted1 = List.sortBy metric1 table
let best2 = List.maxBy metric2 table
let sorted2 = List.sortBy metric2 table
let best3 = List.maxBy metric3 table
let sorted3 = List.sortBy metric3 table

//table |> List.iter (fun r -> printfn "%A" (metric2 r))

关于根据动态优先级显示结果的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28516366/

相关文章:

java - 最少穿过 N 条平行线

java - 测试两个二叉树是否相等的最有效方法

algorithm - 二次函数的渐近紧界

arrays - 如何为这种情况开发算法(除了蛮力)?

android - 任何算法来检查包含特定颜色的每个像素?在安卓 :)

python - 如何将一个字符串散列成 8 位数字?

algorithm - 测试未排序的集合在线性时间内是否不相交。 (作业题)

algorithm - 在 O(n) 时间内执行连接?

c# - 如何从图像文件生成马赛克图片?

algorithm - 在 LogSpace 中检测给定图是否为树