2016-12-27 8 views
0

私は9つの製品を持っています。バスケットは、各製品がバスケットに0〜9回現れるように、製品の任意の組み合わせを含むことができる。たとえば、basket1にはproduct1の0、product2の3、product3の1などが含まれます。数値の変数への組み合わせの1-1のマッピングを生成する方法

それぞれのバスケットに固有のBasketIdを生成したいとします。上記の例では、 "product1_0 product2_3 ..."のような長い文字列になるという明白なIdを行うのではなく、ストレージ効率のために数値Idを使用したいと考えています。

9つの製品があり、それぞれ10回発生する可能性があるため、10^9の組み合わせが可能です。だから私はまた

get_product_counts <- function(get_basketId){ 
    # given a basketId, return the count of each product 

} 

任意の提案をどのようにこれを行うには可逆で

get_basketId <- function(p1, p2, p3, p4, p5, p6, p7, p8, p9){ 
    # given the count of each product, return a unique numeric id 

} 

のようなマッピングを作成することができるはずですか?

Cantor Pairingも理論的解決策の1つですが、残念なことにCantor Pairingの結果、オーバーフローするIDが不必要に大きくなります。

+2

9桁の10進数を使用してください。 –

+0

@MatthewLundberg素晴らしい解決策。私はもう少し一般化可能なものを望んでいましたが、私の制約から、あなたのソリューションは素晴らしいものになるでしょう。 – Ben

+0

制約がなければ、一般的な解決策はありません。 –

答えて

1

M個の異なるタイプのアイテムのコレクションがあり、それぞれ0.N回指定できる従来の解決策は、M桁のベース(N + 1)番号でエンコードすることです。

タイプの数を減らしてもコードが同一であることを実証する方が簡単です。

get_basketId <- function(p1, p2) { 
    return (10*p2 + p1) 
} 

get_product_counts <- function(id) { 
    return (list(id %/% 10, id %% 10)) 
} 
2

私はこのために六角形が好きです。これは、より短い、そしてもっと元気な人です。

get_basketId <- function(...){ 
    args <- list(...) 
    num <- as.integer(paste0(c(1, unlist(args)),collapse="")) 
    as.hexmode(num) 
} 

get_product_counts <- function(basketId){ 
    num <- as.integer(as.hexmode(basketId)) 
    res <- as.integer(strsplit(as.character(num), "")[[1]])[-1] 
    setNames(res, paste0("p", 1:length(res))) 
} 

get_basketId(1, 2, 3, 4) 
#[1] "2be2" 

get_product_counts("2be2") 
#p1 p2 p3 p4 
# 1 2 3 4 
関連する問題