賽題的核心問題在于,尋找從給定的起點到給定的終點的路徑。其中起點和終點可以是實體Id或者作者AuId,路徑中的節點間指向關系如下圖所示,路徑的長度為小于或等于3。
對于每個測試用例,REST服務將接收到一個HTTP請求,請求數據中包含一個JSON數組,數組中有一對實體標識符,其中標識符是64位整型數字,如[123,456]。REST服務的最長響應時間為300秒。
響應中的JSON數組中應該包含一個路徑列表[path1, path2, …, pathn] 其中pathi都是實體標識符。例如,如果你的程序找到了1個1跳路徑,兩個兩跳路徑和一個三跳路徑,結果就類似于[[123,456], [123,2,456], [123,3,456], [123,4,5,456]],這個結果里邊的數字都是實體標識符。初始方案初始階段,我們試圖從起點開始,根據節點關系從前向后拓展,直至找到終結點或跳數超過限制。這是一種“大一統”的算法,如果存在可行方案,當跳數限制修改時,此算法仍舊實用。為此我們繪制了如下狀態轉移圖解決方案:從兩端出發,而不是單純的從一端出發,即從start和end同時向中間匯聚。不去進行FId、JId、FId的查詢。
改進版本根據從兩端出發的指導思想,以減少請求次數為設計目標,分別為Id-Id/Id-AuId/AuId-Id/AuId-AuId四種情況進行了如下設計AA.java:Auid/Afid的包裝類
C.java:Cid的包裝類
F.java:Fid的屬性包裝類
J.java:Jid的屬性包裝類
Entity.java:實體的包裝類,包含ID/AA/C/F/J等屬性
PathNode.java:路徑類,包含currentId/nextNode/stepNums等屬性
RequestChainNode.java:包裝類,包含currentId/requestType/parent/nextNodes/stepNum屬性
EvaluateResult.java:包裝類,包含(RequestChainNode)from/(String)expr/entities屬性
HttpClientUtil.java:定義http請求相關方法,根據id類型及參數查詢,得到返回結果
RequestMode.java:針對上述http請求方法,標識調用哪一個
RequestType.java:定義請求的id類型
SearchCallable.java:搜索回調類,根據RequestType和RequestMode選擇調用的HttpClientUtil中的方法。
ThreadPoolTest.java:調用EvaluateResult.java、HttpClientUtil.java和RequestType.java類,進行簡單提交請求。
Z.java:調用searchService2類search方法,進行簡單測試
源代碼地址:GitHub
新聞熱點
疑難解答