[关闭]
@Alllll0235 2017-08-30T11:58:58.000000Z 字数 1035 阅读 768

寻找二维峰值

learing


  1. //寻找行中的最大值
  2. int findRowPeak(int row, int** A, int start, int end)
  3. {
  4. int peak = 0;
  5. for (int i = start; i <= end; i++)
  6. if (A[row][i]>A[row][peak])
  7. peak = i;
  8. return peak;
  9. }
  10. //寻找列中最大值
  11. int findColPeak(int col, int** A, int start, int end)
  12. {
  13. int peak = 0;
  14. for (int i = start; i <= end; i++)
  15. if (A[i][col]>A[peak][col])
  16. peak = i;
  17. return peak;
  18. }
  19. int findTwoDimPeak(int**a, int n, int m)
  20. {
  21. //初始化行的二分边界,还有列的二分边界
  22. int rowmin = 0, rowmax = n - 1, rowmid = rowmax / 2;
  23. int colmin = 0, colmax = m - 1, colmid = colmax / 2;
  24. while (rowmin <= rowmax && colmin <= colmax)
  25. {
  26. //计算行的二分中点
  27. rowmid =(rowmax - rowmin)/2+rowmin;
  28. //找出中间行的最大数
  29. int rowpeak = findRowPeak(rowmid, a, colmin, colmax);
  30. //比较最大数与上面和下面的数的大小
  31. if (rowmid!=rowmax&&a[rowmid][rowpeak] < a[rowmid + 1][rowpeak])
  32. {
  33. rowmin = rowmid + 1;
  34. }
  35. else if (rowmid!=rowmin&&a[rowmid][rowpeak] < a[rowmid - 1][rowpeak])
  36. {
  37. rowmax = rowmid - 1;
  38. }
  39. else
  40. return a[rowmid][rowpeak];
  41. //计算列的二分中点
  42. colmid = colmin + ((colmax - colmin) / 2);
  43. int colpeak = findColPeak(colmid, a, rowmin, rowmax);
  44. if (a[colpeak][colmid] < a[colpeak][colmid + 1])
  45. {
  46. colmin = colmid + 1;
  47. }
  48. else if (a[colpeak][colmid] < a[colpeak][colmid - 1])
  49. {
  50. colmax = colmid - 1;
  51. }
  52. else return a[colpeak][colmid];
  53. }
  54. return a[rowmid][colmid];
  55. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注