[a,b]=>k

來源:互聯網
上載者:User

 

今天遇到的一個問題,可以抽象成如下所述:

有n個整數,就假定是都大於0的,也就是n個正整數,各不相同。從中任選兩個數可以構成一對[a,b]其中a!=b),並且認為[a,b] == [b, a],需要用這一對來作為一個簽名,或者簡單點說就是一個標識用來唯一地確定另外一組東西E。但是,E中的元素e是用一個整數來標記,也就是說不能夠直接將[a, b]賦給e。

ok,問題清楚了,實際上這裡需要的就是將[a, b]轉換成另外一個數k,然後用k來標記e。

如何解決?這實際上是一個將二維空間壓縮成一維的問題,直接用簡單的四則運算肯定是不行的,那樣可能會導致將不同的[a, b]映射到同一個k。期間我也考慮過用位(bit)運算,不過貌似也不行。

 

考慮到n[i]一般不會太大(基本上都<10 000),可以利用下面這個式子進行映射:

 

k=K(<a, b>) = min(a, b)*MAX(n) + max(a, b)

 

其中MAX(n)表示n個正整數中的最大值,對於給定的數集合來說這是一個定值。然後用它乘以a, b中較小的一個,這樣可以保證最後得到的k值相對小一些。這個思路有點段地址+位移量的感覺,前面兩個數相乘後相當於一個段地址,後面再加上一個位移量,這樣可以保證唯一地映射到一個k值。

這個方法的缺點是映射後k可能比較大,並且因為有乘法理論上還是存在越界的問題。

 

繼續考慮ing,希望有更好的辦法……

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.