用DFS解決組合問題

一直以來,大量作各種管理系統的程序員,大量的時間都在處理各種增刪改查問題,對於其餘的方面尤爲是算法層面的涉及較少,此次就遇到一個問題。前端

業務場景

用戶上傳一份Excel,讓用戶選擇其中的部分列頭,程序對列頭作兩兩組合,並對全部的組合取Excel表中的數據,繪製一個折線圖。java

問題分解

  1. 文件上傳。前端使用異步插件提交文件,後臺使用file接受便可。升級點在於進度條、重傳、備份等
  2. 文件解析,基於POI、easyexcel等框架,都不難實現
  3. 選擇列頭作兩兩組合,典型的求組合問題,DFS的方式是通用實現方式。
  4. 組合獲取數據,哈希表作key的方式,取出部分列,沒難度
  5. 繪製圖表,echarts、d3js、highcharts、G2 都沒有太大難度

技術實現

抽象後的背景:針對兩兩組合,即在m列中求出全部2個的組合,能夠經過雙重循環完成,簡單易懂。程序員

雙重循環

for(int i=0;i<arr.length;i++){
      for(int j=i+1;j<arr.length;j++){
            //...do something
            arr[i]; arr[j];      
      }
}

通用作法,基於dfs算法實現算法

DFS深度便利

private void dfs(int[] arr, int target,int begin, Deque<Integer> path, Set<List<Integer>> res) {
     if ( path.size()== target) {
        res.add(new ArrayList<>(path));
        return;
    }else if(begin>arr.length){
        return;
    }
    for (int i = begin; i < arr.length; i++) {
        path.add(arr[i]);
        dfs(arr,target,i+1,path,res);
        path.removeLast();
    }
}

優劣比較

方式一快速簡單,上手快,缺點是沒有擴展性,一旦組合數變成三、四、5,多重循環顯然不合適。
方式二通用能適用各類組合數變化,只要調整target的數字便可。echarts

後記

這是一個並不複雜的問題,但反映出算法在編碼過程當中的一些問題,必定要注意抽象,將個性化的業務問題抽象爲技術問題,用通用的技術去解決,代碼的健壯性大大提升。框架

相關文章
相關標籤/搜索