我真的把我的頭撞在牆上,因爲我對算法的經驗很少。基於任意規則將項目插入(混淆)到陣列
請考慮一個應用程序,它維護一組電視節目和這些節目的劇集。允許用戶對節目進行排名(排名,而非比率;因此從0到n-1,0是最高排名)。
該應用旨在根據節目的排名呈現劇集列表。在任何給定時間,應用將在每個節目的列表中顯示0,1或2個情節(即,如果用戶已觀看TheFooShow的所有情節,則列表中不會出現情節;如果她有10個未觀看情節TheBarShow的兩集將出現在列表中)。這些劇集將被視爲primary
和secondary
。
事件列表內的排序應當遵守一定的規則儘可能地:
- 在列表中顯示的主要情節應該出現之前的排名較低的顯示 任何發作
- 的節目的二次集應該永不相同節目
- 如果可能的話主情節之前出現,的節目沒有兩個集應該內的彼此
- 二次4個位置以前的節目主要情節排名更糟糕的七個或更多位置
- 等
這裏的關鍵是,從高排名的節目劇集將前低排名顯示上市,但只有一個節目插曲可以出現儘可能地引入一定量的品種。
一個例子集可以是(不嚴格遵循上述規則):[0, 1, 3, 0', 3', 4, 5, 10, 4', 11, 11', 23]
我能得到接近實現構建從頭列表時所期望的結果,將所有的主集,然後將所述次級需要的情節。不幸的是,考慮到應用程序的其他部分是如何工作的,我需要能夠將情節插入已經構建的列表中。
鑑於底層情節數據如何變化,無論何時需要插入情節,該節目已經在列表中的所有情節將被刪除,該節目的當前情節集將被發現,並且他們(或者它)將被連續插入。
我會實質類似的功能,如:
- (int, int)indexesForEpisodesFromShow:(TVShow)aShow currentList:(List)aList
,可以採取名單在任何狀態下,鑑於一秀,採取相應的事件並確定在列表中,他們應該被插入。
我目前的解決方案是相當原始的,正如我所說的只適用於某些情況。我嘗試了更復雜的其他解決方案(閱讀:如果聲明更多),但它們往往變得非常脆弱,並且當我增加處理邊緣情況的額外複雜性時,測試開始與其他測試相矛盾。
我覺得自己想要實現的規則種類很少,有多少,這應該是可以解決的,但是經過多次嘗試,我仍然堅持不懈。任何幫助將不勝感激。
這聽起來很不錯。我會嘗試並報告回來。 – farski
如果在CompareEpisode中,第一個返回應該是'return -CompareDiff(e2,e1);',那麼代碼中存在一個錯誤,在else的外部分支中。 –
我用這種方法遇到的問題是強制執行與保持類似劇集之間的最小距離有關的規則。例如,如果我插入一個節目的第二集,當我正在瀏覽列表時,我將它傳遞給主節目並返回1,但當我轉到下一集時,我仍然需要做一個看看周圍發生的事情,而不是通過什麼,看看我是否會達到最低限度。距離要求 – farski