一直以來,大量作各種管理系統的程序員,大量的時間都在處理各種增刪改查問題,對於其餘的方面尤爲是算法層面的涉及較少,此次就遇到一個問題。前端
用戶上傳一份Excel,讓用戶選擇其中的部分列頭,程序對列頭作兩兩組合,並對全部的組合取Excel表中的數據,繪製一個折線圖。java
抽象後的背景:針對兩兩組合,即在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算法實現算法
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
這是一個並不複雜的問題,但反映出算法在編碼過程當中的一些問題,必定要注意抽象,將個性化的業務問題抽象爲技術問題,用通用的技術去解決,代碼的健壯性大大提升。框架