主頁 > 企業開發 > 使用距離標準對二元排列進行排名和非排名

使用距離標準對二元排列進行排名和非排名

2022-09-15 00:56:10 企業開發

我想使用距離標準對二進制排列進行排名和取消排名。

例子:

maxDistance := 2

組成元素的有效二進制排列0011如下:

0101-> 排名 0

1010-> 排名 1

0110-> 無效,因為 的第一個索引0為 0,但第二次0出現的索引為 3。3-0 > maxDistance

0011-> 無效,因為第一次出現1在索引 2 處,但距離為 3。

distance通過相等元素索引計算兩個相鄰相等元素的差異不超過abs(distance),但對于第一次出現的元素index 1 == distance. maxDistance適用0在二進制排列中 1可能出現不相等的。是給定排列在有效排列的有序串列中的索引。0,1Rank

to rank = 二進制排列到 indexnumber(Rank), maxDistance

to unrank = Rank occurrences occurrences 0 1maxDistance to permutation

int calcMaxDistance(BitSet set){
  int max0 =0;
  int max1 =0;
  int lastIndex0 =0;
  int lastIndex1 =0;

  for(int i=0; i < set.size();i  ){
    if(set.get(i)){
      if(lastIndex1 ==0 && max1 ==0){
        max1 = i 1;
      }else{
        if(i - lastIndex1 > max1){
          max1 = i - lastIndex1;
        }
      }
      lastIndex1 = i;
    }else{
      // Same structure for max0 like with max1
    }
  }
  return Math.max(max0,max1);
}

有人知道如何構造演算法嗎?

uj5u.com熱心網友回復:

這是一個實作。

首先,一種自上而下的動態規劃方法來分析可接受的排列。如果您有符號計數n1, n2, ..., nk,那么這可能需要像O(n1*n2*...*nk).

def analyze_distance_perm(symbols, distance):
    s_count = {}
    for s in symbols:
        if s in s_count:
            s_count[s]  = 1
        else:
            s_count[s] = 1
    starting_state = []
    for s, count in s_count.items():
        starting_state.append((s, 1, count))

    cache = {}
    def recur (remain, state):
        key = (remain, tuple(state))
        if key not in cache:
            if 0 == remain:
                cache[key] = {"c": 1, "t": None}
                for s, dist, left in state:
                    if distance < dist:
                        cache[key] = None
                        break
            else:
                next_state = []
                for i in range(len(state)):
                    s, dist, left = state[i]
                    if distance < dist:
                        next_state = None
                    elif next_state is not None:
                        next_state.append((s, dist 1, left))
                if next_state is None:
                    cache[key] = None
                else:
                    count = 0
                    transition = {}
                    for i in range(len(next_state)):
                        s, dist, left = next_state[i]
                        if 0 < left:
                            next_state[i] = (s, 1, left-1)
                            result = recur(remain-1, next_state)
                            if result is not None:
                                count  = result['c']
                                transition[s] = result
                            next_state[i] = (s, dist, left)
                    if 0 == len(transition):
                        cache[key] = None
                    else:
                        cache[key] = {'c': count, 't': transition}

        return cache[key]
    return recur(len(symbols), starting_state)

有了這個分析,排名/取消排名就很簡單了。(我之前選擇將排名稱為排列數,因此第一個排名為 0。如果您愿意,可以輕松調整。)

def rank_perm(perm, analysis):
    if 0 == len(perm):
        return 0
    elif analysis is None or perm[0] not in analysis['t']:
        return None
    rank = 0
    for s, subanalysis in analysis['t'].items():
        if s != perm[0]:
            rank  = subanalysis['c']
        else:
            subrank = rank_perm(perm[1:], subanalysis)
            if subrank is None:
                return None
            else:
                return rank   subrank

def perm_at_rank(rank, analysis):
    return list(reversed(_perm_at_rank(rank, analysis)))

def _perm_at_rank(rank, analysis):
    if analysis is None or analysis['t'] is None:
        if rank == 0:
            return []
        else:
            return None

    for s, subanalysis in analysis['t'].items():
        if rank < subanalysis['c']:
            subperm = _perm_at_rank(rank, subanalysis)
            if subperm is None:
                return None
            else:
                subperm.append(s)
                return subperm
        else:
            rank -= subanalysis['c']

這是您的原始示例,顯示它可以正確地對每個排列進行排名和取消排名。

analysis = analyze_distance_perm('0011', 2)
for i in range(analysis['c']):
    perm = perm_at_rank(i, analysis)
    print(i, perm, rank_perm(perm, analysis))

還有一個不那么瑣碎的例子。

analysis = analyze_distance_perm('0001122', 4)
for i in range(analysis['c']):
    perm = perm_at_rank(i, analysis)
    print(i, perm, rank_perm(perm, analysis))

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/507878.html

標籤:数组 算法 数学 组合 排列

上一篇:有沒有更優雅的方法來計算來自2個陣列的布林值組合?

下一篇:返回列表

標籤雲
其他(144678) Python(37186) JavaScript(24757) Java(16387) C(14925) 區塊鏈(8236) C#(7934) AI(7469) 爪哇(7362) html(6737) MySQL(6702) 基礎類(6313) sql(6076) 熊猫(6047) PHP(5770) 数组(5717) R(5301) Linux(5168) 反应(5146) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4407) 数据框(4304) css(4231) 节点.js(4004) C語言(3288) json(3231) C++語言(3117) 列表(3114) 扑(3071) 安卓(2988) 打字稿(2929) VBA(2761) Java相關(2746) 疑難問題(2699) 细绳(2518) 單片機工控(2479) iOS(2376) ASP.NET(2345) MongoDB(2313) 麻木的(2284) 正则表达式(2214) 字典(2211) 循环(2192) 迅速(2157) 镖(2146) 擅长(2134) 功能(1964) Web開發(1951) 弹簧靴(1899) python-3.x(1894) xml(1865) for循环(1840) 谷歌表格(1835) Unity3D(1822) PostgreSQL(1802) 網絡通信(1793) .NETCore(1787) .NET技术(1783) 蟒蛇-3.x(1774)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用距離標準對二元排列進行排名和非排名

    我想使用距離標準對二進制排列進行排名和取消排名。例子:maxDistance := 2組成元素的有效二進制排列0011如下:0101-> 排名 01010-> 排名 10110-> 無效,因為 的...

    uj5u.com 2022-09-15 00:56:10 more
  • 有沒有更優雅的方法來計算來自2個陣列的布林值組合?

    我試圖盡可能簡單地表達這個問題,但我是 Python 新手,邏輯非常糟糕,所以我遇到了一些麻煩。基本上我想知道是否有一種更簡潔的方法來計算兩個一維布爾陣列的混...

    uj5u.com 2022-09-15 00:55:36 more
  • 給定兩個串列,如何列印修飾頻率表?

    我正在嘗試創建一個可以充當計算器專案頻率表的類。我在以格式良好的方式列印表格時遇到問題。這是我當前的代碼:class FrequencyTable: def __init__(se...

    uj5u.com 2022-09-15 00:54:59 more
  • GNSS模塊的投影

    如何使用平坦地面上的資料h計算GNSS 模塊在某個高度的投影?x, y, z, roll, pitch, yaw我在網上搜索并找不到有關如何處理此類問題的任何資訊。
    uj5u.com...

    uj5u.com 2022-09-15 00:54:23 more
  • 從不同坐標系匯入變換矩陣

    我目前正在并行運行兩個具有 2 個不同坐標系的游戲引擎:古墓麗影(TR)坐標系;超級馬里奧 64(SM64)坐標系;要轉換頂點位置(TR->SM64),我只需執行以下操作:x' = x/縮放y'...

    uj5u.com 2022-09-15 00:53:36 more
  • 用char代替 -*/的數學運算

    所以我的代碼會要求用戶輸入他想要執行的操作( - * /),然后是兩個數字。基于此,一堆 if 陳述句將確定用戶想要什么型別的操作并計算結果。我正在嘗試將所有這...

    uj5u.com 2022-09-15 00:52:27 more
  • 給定n是10的互質數,如何找到僅由1組成的可以被n整除的最小數?

    我正在撰寫一個程式來找到最小的數字m僅由數字“1”組成,該數字可以除以給定的數字n。n必須是 10 的互質數。例如:n = 37 -> m = 111 (111/37 =3)n = 11 -> m...

    uj5u.com 2022-09-15 00:51:28 more
  • C#程式無法使用蒼鷺公式查看三角形區域的結果

    我一直在嘗試解決這個關于我的程式的問題,即使用 Heron 公式和用戶輸入列印三角形面積的最終結果static void Main(string[] args) { //varia...

    uj5u.com 2022-09-15 00:50:11 more
  • Python-線性到對數比例轉換

    有沒有辦法轉換數字范圍?我需要將線性范圍(0-1)轉換為對數范圍(100*10^-12 - 1),這樣我就可以在繪圖上放置一條可移動的水平線(https://plotly.com/python /horizo...

    uj5u.com 2022-09-15 00:49:22 more
  • 如何創建一個可以通過呼叫Python中的函式來更改的變數,同時還可以

    例如,假設我正在嘗試在 python 中創建一個錢包系統,可以在其中添加和取出錢。我在這里嘗試這段代碼:balance = 0def addmoney(x): x = balanceaddmoney(10...

    uj5u.com 2022-09-15 00:48:43 more