多维度数据排序

2017-06-20

    刚开始看Fluent Python,第一章第一节(一摞Python风格的纸牌)提到对一副扑克牌排序的问题。

    按照常规,用点数来判定扑克牌的大小,2 最小、A 最大;同时还要加上对花色的判定,黑桃最大、红桃次之、方块再次、梅花最小。

    解法是将点数对应到数值 0-12 花色对应到数值 0-4 这样每一张牌都可以计算得到一个数值。关键点就在于数值的计算,我的直觉是__点数数值10 + 花色数值__; 作者的解法是__点数数值花色种类(4) + 花色数值__。当然这两种解法都可以达到比较一副扑克牌中每张牌的大小进而完成排序的目的,但是为什么是点数数值乘以花色种类(4)呢? 反过来问,为什么是乘以10呢?其实点数乘以4及4以上的整数都可以达到比较扑克牌大小的目的,只因为我已经习惯了使用十进制......

    再仔细思考一下,其实作者的计算方式算出来每一张牌对应的数值是从0-51连续的,密不透风的连续整数;而如果按我最初的直觉来计算,是一堆分散的整数。并且如果扑克牌的花色不止4种,而是20种呢?我的计算方法甚至是错误的。

    当然扑克牌的花色只有4种,如果把这个问题抽象一下,可以看做将一个事物按AB两个维度(数值,花色)排序,A维度的权重绝对大于B维度(数值 > 花色),对这个事物的估值公式就是__A * len(B) + B__ -- 暂且用len(B)表示B的种类数。再衍生到ABC3个维度的排序,可以得到公式__A * len(B) * len(C) + B * len(C) + C__可以计算出连续的排序数值。

    这里面一定有什么数学上的解释,比如这种计算方式和进制十分相似,只不过不同维度的进制可能是不同的(等于这一维度的种类数),奈何我的数学水平没到那个层次,导致描述得不是很清楚,意会了先。

    标签: python