「sku」在商業活動中幾乎無處不在,開發過商品系統的開發者也一定接觸過。簡而言之,sku就是商品編碼,它在企業的系統體系內具有唯一性。
業務場景
有時,企業需要兩套甚至多套的sku,例如,編號為abc的商品,在企業內部使用abc作為編碼,在大陸銷售時用abc-1,但在海外銷售時用abc-2。甚至,由於業務需要,每套編碼要看起來完全沒有關聯、沒有規律可循,例如,編碼abc轉化後變成ckr。
問題在資訊化系統中,要如何架構商品的sku模組,以保證相關的sku最終能夠回溯到原初的那個sku編碼?
方案方法
說明優劣
資料庫記錄
一一對應記錄原始sku和轉化後的sku。
資料量大、需要保全關聯資料的安全。
演算法演算法能夠將sku轉化成輸出編碼,同時輸出編碼也能還原成原始sku。
無需資料庫、只需保證初始配置、演算法不洩露。
我採用的是「演算法」的方案:sku有且只有一套,針對不同的應用場景配置不同的演算法,得到新的sku;反之,演算法逆運算也能從新sku還原出原始sku(簡稱原sku)。
演算法格式約束
sku只允許由字母、數字、橫桿線組成,橫桿線不參與格式轉化。
單元編碼**化原料)
字母(序列): abcdefghijklmnopqrstuvwxyz
數字(序列): 0123456789
符號(序列): -
示例原sku: x-a68nb
偏移法這是最簡單的演算法。假設偏移值為2,那麼a轉化為c,z轉化為b,6轉化為8,8轉化為0,以此類推。負數偏移的情形也是一樣,d轉化為b,5轉化為3。
翻轉法想象一下單元編碼中的字母都寫在紙張上,將紙張180°翻轉後,得到倒序排列的字母序列:z-a。兩個序列字母數量一樣,原序列中的每個字母根據自身的位置都能在倒序序列中找到對應字母,本文中,我將這種方式稱作「倒序匹配」。數字的情形也是一樣,值得一題的是,每個字母(或數字)在倒序序列中對應的字母一定和自己不一樣,因為字母的總數是偶數。
翻轉法,就是用倒序序列中的對應字母、數字替代原來的字母、數字。例如,a轉化為z,4轉化為5,0轉化為9。
數學原理
翻轉其實也是偏移法,只是計算的方式有區,偏移法是在直接偏移原有的位置,翻轉法是用原位置到終點的距離作為偏移值。例如,x在26個字母中的位置是24,它和終點字母z有2個偏移的距離。
單元編碼是有序的,演算法規則也是有序並且可逆的,那麼所有的設計演算法這一定也是有序的。演算法的本質,是找出單個字元的對應字元,其方法不是在有序的原序列中找對應字元,就是在有序的倒序序列中找對應字元。據此分析,我們可以推斷:偏移法是所有複雜演算法的根基,其他演算法最終肯定會使用到偏移法。
高階演算法
混合法偏移翻轉或翻轉偏移,前者是先偏移再翻轉,後者是先翻轉再偏移。
截斷偏移法
假設截斷點為3,那麼,前3位按照偏移值「2」轉化,3位之後的字元都按照「-1」的偏移值轉化。
截斷翻轉偏移法
假設截斷點為3,那麼,前3位用偏移法,3位之後用翻轉法。
奇偶數字置混合法
每個字元在原序列中的位置,不是奇數就是偶數,如果偏移值是奇數,那麼轉化後,奇數字置一定變為偶數字置,,偶數字置也變為奇數字置。例如,偏移值為1,那麼a將轉化為b,位置由偶數0變為奇數1,4轉化為5,位置由奇數5變為偶數6。
同時,一旦使用翻轉法,奇數字置的字元轉化後的字母在原序列中一定是偶數字置,反之也成立。例如,a的位置是0,翻轉後是z,位置是25;7的位置是7,翻轉後是位置為2的2。
基於上述特徵,當偏移值為奇數時,偶數字置的字元採用翻轉法,強制轉化為奇數字置的字元,奇數字置的字元採用偏移法,位置轉化為偶數。還原的時候,則要按照偶數偏移成奇數、奇數翻轉成偶數的規則。
更多現在,我們能夠基於最基本「偏移法」開始衍生出更多複雜的演算法,但務必保證演算法是可逆的。假設使用「甲->乙->丙」3個方法轉換出新sku,還原的時候就必須要以「丙->乙->甲」的順序轉化,否則演算法有誤。
實用事實上,不需要那麼多眼花繚亂的演算法,單憑「偏移法」就能夠轉化出和原sku毫無關聯的新sku,僅需要打亂單元編碼:
字母(序列): kcebhfgamzjlnodysqituvpxrw
數字(序列): 1024573968
然而,這些分析不僅有趣、鍛鍊思維,而且能夠練習**的構架能力,這才是真正的樂趣。
有趣的演算法
friday,july 22,2016 19 50 50 a b兩人分別在兩座島上。b生病了,a有b所需要的藥。c有一艘小船和乙個可以上鎖的箱子。c願意在a和b之間運東西,但東西只能放在箱子裡。只要箱子沒被上鎖,c都會偷走箱子裡的東西,不管箱子裡有什麼。如果a和b各自有一把鎖和只能開自己那把鎖的鑰匙...
演算法題 有趣的數字
小q今天在上廁所時想到了這個問題 有n個數,兩兩組成二元組,差最小的有多少對呢?差最大呢?輸入描述 輸入包含多組測試資料。對於每組測試資料 n 本組測試資料有n個數 a1,a2 an 需要計算的資料 保證 1 n 100000,0 ai int max.輸出描述 對於每組資料,輸出兩個數,第乙個數表...
演算法題 有趣的排序
度度熊有乙個n個數的陣列,他想將陣列從小到大 排好序,但是萌萌的度度熊只會下面這個操作 任取陣列中的乙個數然後將它放置在陣列的最後乙個位置。問最少操作多少次可以使得陣列從小到大有序?輸入描述 首先輸入乙個正整數n,接下來的一行輸入n個整數。n 50,每個數的絕對值小於等於1000 輸出描述 輸出乙個...