最近在学习《 编程之美 》这本书,书中提到了很多很经典的算法问题和实现,学起来真是耗费脑细胞啊。书中的算法实现使用C编写的,这里作者自己写了一部分java的实现,如果有错误,还请各位读者批评指正。截图版权属于原作者。
github:
https://github.com/cstriker1407/think_in_java
CONTENTS
1.8小飞的电梯调度算法
生成测试数据:
Random random = new Random(); int floorNums = random.nextInt(10) + 1; System.out.println("电梯总层数:" + (floorNums)); int[] peopleNums = new int[floorNums]; for (int i = 0; i < peopleNums.length; i++) { peopleNums[i] = random.nextInt(20); System.out.println("第[" + (i+1) +"]层的乘客数目为:" + peopleNums[i]); }
解法1:
public static void liftDispatchA(int [] peopleNums) { int floorNum = peopleNums.length; int minUse = -1; int bestFloor = -1; for (int i = 0; i < floorNum; i++) { int thisUse = 0; /* i 代表当前停留楼层(从0计数) */ for (int j = 0; j < floorNum; j++) { thisUse += Math.abs(i - j) * peopleNums[j]; } if (minUse == -1 || minUse > thisUse) { minUse = thisUse; bestFloor = i; } } System.out.println("最优停留楼层:" + (bestFloor + 1)); System.out.println("耗费人力:" + minUse); }
解法2:
public static void liftDispatchB(int [] peopleNums) { int floorNum = peopleNums.length; /* 以电梯停留在第0层开始(从0计数) */ int N1 = 0; int N2 = peopleNums[0]; int N3 = 0; int minUse = 0; int bestFloor = 0; for (int i = 1; i < floorNum; i++) { N3 += peopleNums[i]; minUse += peopleNums[i] * i; } /* * F(i+1) = F(i) + N1 + N2 - N3 * 如果N1 + N2 > N3,则可以推出 F(i+1) > F(i); * 同时由于从电梯0层开始向上计数,因此N1增加,N3减小,一旦在某一层上N1 + N2 > N3,那么剩余的电梯层必然也会N1 + N2 > N3, * 就可以不用计算了 */ for (int i = 1; i < floorNum; i++) { if (N1 + N2 > N3) { break; }else { bestFloor = i; minUse = minUse + N1 + N2 - N3; N1 += N2; N2 = peopleNums[i]; N3 -= peopleNums[i]; } } System.out.println("最优停留楼层:" + (bestFloor + 1)); System.out.println("耗费人力:" + minUse); }
发表评论