2013-12-10 78 views
0

我真的把我的頭撞在牆上,因爲我對算法的經驗很少。基於任意規則將項目插入(混淆)到陣列

請考慮一個應用程序,它維護一組電視節目和這些節目的劇集。允許用戶對節目進行排名(排名,而非比率;因此從0到n-1,0是最高排名)。

該應用旨在根據節目的排名呈現劇集列表。在任何給定時間,應用將在每個節目的列表中顯示0,1或2個情節(即,如果用戶已觀看TheFooShow的所有情節,則列表中不會出現情節;如果她有10個未觀看情節TheBarShow的兩集將出現在列表中)。這些劇集將被視爲primarysecondary

事件列表內的排序應當遵守一定的規則儘可能地:

  • 在列表中顯示的主要情節應該出現之前的排名較低的顯示
  • 任何發作
  • 的節目的二次集應該永不相同節目
  • 如果可能的話主情節之前出現,的節目沒有兩個集應該內的彼此
  • 二次4個位置以前的節目主要情節排名更糟糕的七個或更多位置

這裏的關鍵是,從高排名的節目劇集將前低排名顯示上市,但只有一個節目插曲可以出現儘可能地引入一定量的品種。

一個例子集可以是(不嚴格遵循上述規則):[0, 1, 3, 0', 3', 4, 5, 10, 4', 11, 11', 23]

我能得到接近實現構建從頭列表時所期望的結果,將所有的主集,然後將所述次級需要的情節。不幸的是,考慮到應用程序的其他部分是如何工作的,我需要能夠將情節插入已經構建的列表中。

鑑於底層情節數據如何變化,無論何時需要插入情節,該節目已經在列表中的所有情節將被刪除,該節目的當前情節集將被發現,並且他們(或者它)將被連續插入。

我會實質類似的功能,如:

- (int, int)indexesForEpisodesFromShow:(TVShow)aShow currentList:(List)aList 

,可以採取名單在任何狀態下,鑑於一秀,採取相應的事件並確定在列表中,他們應該被插入。

我目前的解決方案是相當原始的,正如我所說的只適用於某些情況。我嘗試了更復雜的其他解決方案(閱讀:如果聲明更多),但它們往往變得非常脆弱,並且當我增加處理邊緣情況的額外複雜性時,測試開始與其他測試相矛盾。

我覺得自己想要實現的規則種類很少,有多少,這應該是可以解決的,但是經過多次嘗試,我仍然堅持不懈。任何幫助將不勝感激。

回答

0

我認爲你需要的是一個函數來比較兩集。

首先讓我們做一些假設:

  • 插曲的對象有兩個屬性:
    1. 顯示:展會對象,一個插曲屬於
    2. IsPrime:無論是插曲主
  • 和一個顯示對象具有一個屬性:
    1. 等級:該節目的排名

然後,讓我們創建一個有兩個插曲對象作爲輸入參數,並返回一個函數:

  • -1:第一集必須位於前第二集。
  • 0:兩集可以按任意順序排列。
  • 1:第一集必須在第二集之後定位。

    CompareEpisode(e1, e2) 
    { 
        if(e1.IsPrime) 
        { 
        if(e2.IsPrime) 
         return CompareSame(e1, e2); 
        else 
         return CompareDiff(e1, e2); 
        } 
        else 
        { 
        if(e2.IsPrime) 
         return -CompareDiff(e2, e1); 
        else 
         return CompareSame(e1, e2); 
        } 
    } 
    
    CompareSame(e1, e2) 
    { 
        if(e1.Show.Rank < e2.Show.Rank) 
        return -1; 
        else if(e1.Show.Rank == e2.Show.Rank) 
        return 0; 
        else 
        return 1; 
    } 
    
    CompareDiff(p, s) 
    { 
        if(p.Show == s.Show) 
        return -1; 
        else 
        { 
        if(p.Show.Rank < s.Show.Rank + 7) 
         return -1; 
        else if(p.Show.Rank == s.Show.Rank + 7) 
         return 0; 
        else 
         return 1; 
        } 
    } 
    

現在你可以迭代器列表,使用CompareEpisode在列表中插入事件的每個元素進行比較,找到的第一個元素使CompareEpisode返回0或1,你可以之前插入新的一集找到的元素。

如果有一些元素使得CompareEpisode返回0,那麼你得到了多個候選位置,你可以選擇一個來適應「從相同節目放置劇集到儘可能」的規則。

+0

這聽起來很不錯。我會嘗試並報告回來。 – farski

+0

如果在CompareEpisode中,第一個返回應該是'return -CompareDiff(e2,e1);',那麼代碼中存在一個錯誤,在else的外部分支中。 –

+0

我用這種方法遇到的問題是強制執行與保持類似劇集之間的最小距離有關的規則。例如,如果我插入一個節目的第二集,當我正在瀏覽列表時,我將它傳遞給主節目並返回1,但當我轉到下一集時,我仍然需要做一個看看周圍發生的事情,而不是通過什麼,看看我是否會達到最低限度。距離要求 – farski