史上最简易的,使用redis设计三个排名榜

作者:云顶最新线路检测

思路

入口MQ----------操作Redis-----------同步mysql

利用了redis的排行的榜单的成效

MQ consumerString publicKey="rank.public";String privateKey = "rank.private_"public void updateRank(int userId,long score){ //更新排行榜缓存 redisClient.zincrby(publicKey,score,userId); //维护单个用户 redisClient.incrBy(privateKey+userId,score); //异步更新mysql:因人而异(就不写出来了,简单的一个线程工具) UpdateQueue.update(userId,score);}

public void queryRankTopFive(){ //查询前5 Set<String> zrange = redisClient.zrevrange(publicKey,0,4); //得到之后就可以去按照自己业务去做一些封装了 zrange.forEach(key -> { Long score = redisClient.get(privateKey+key); System.out.println(key+":"+score); });}

如此那般一个排名榜就统一准备实现了.

不足

地点的事例,total = 28,获得的“11 11 5 1”恰巧是最优解。倘使total = 15呢?total = 15时,结果为“11 1 1 1 1”,共用了五枚硬币。然则那不得不算是较优解,不是最优解。因为最优解是“5 5 5”,共三枚硬币。所以贪心算法只好保险局地最优(第一枚11正是一对最优),不能确认保证全局最优。

咱俩仍以15为例,换一种思路,看看怎么样获取最优解。面值为1时,起码必要一个一元硬币

面值为2时,至少必要多少个一元硬币

面值为3时,最少要求多个一元硬币

票面价值为4时,最少供给八个一元硬币

面值为5时,有多少个方案:① 在面值为4的功底上加二个1元的硬币,须要三个硬币② 挑二个面值为5元的硬币,需求贰个硬币取最小值,供给贰个硬币

面值为6时,几个方案:① 比1元多了5元,须要八个硬币② 比5元多了1元,须要八个硬币取最小值,需求四个硬币

面值为7时,五个方案:① 比1元多了6元,要求八个硬币② 比5元多了2元,须求八个硬币取最小值,需求多个硬币

票面价值为8时,七个方案:① 比1元多了7元,要求多个硬币② 比5元多了3元,要求三个硬币取最小值,供给多个硬币

面值为9时,七个方案:① 比1元多了8元,要求三个硬币② 比5元多了4元,须要多少个硬币取最小值,须求多少个硬币

面值为10时,多少个方案:① 比1元多了9元,需求两个硬币② 比5元多了5元,须要多个硬币取最小值,要求七个硬币

面值为11时,两个方案:① 比1元多了10元,供给四个硬币② 比5元多了6元,需求多少个硬币③ 取面值为11元的硬币,需求三个硬币取最小值,供给贰个硬币

面值为12时,多个方案:① 比1元多了11元,要求多少个硬币② 比5元多了7元,要求八个硬币③ 比11元多了1元,需求多个硬币取最小值,要求五个硬币

面值为13时,三个方案:① 比1元多了12元,须要八个硬币② 比5元多了8元,须求多少个硬币③ 比11元多了2元,需求多个硬币取最小值,要求多个硬币

面值为14时,四个方案:① 比1元多了13元,须要八个硬币② 比5元多了9元,必要五个硬币③ 比11元多了3元,须要多个硬币取最小值,需求多个硬币

面值为15时,八个方案:① 比1元多了14元,须求多个硬币② 比5元多了10元,须要三个硬币③ 比11元多了4元,必要四个硬币取最小值,须要五个硬币

末段,获得的小小硬币数是3。而且从推导进程可以看到,总计二个数据的足足硬币数,比如15,必须把它后面的具有数额的起码硬币数都总结出来。那够成了一个递推的进度。

上述推导进度的Java实现:

#include<iostream>using namespace std;/** * 动态规划算法 * @param val: 保存所有币值 * @param kinds: 有多少种硬币 * @param money: 金额 * @param cnt: 保存所有金额所需的最小硬币数 */void dp(int val[], int kinds, int money, int cnt[]){ cnt[0] = 0; // 保存1元、2元、3元、……、money元所需的最小硬币数 for (int i = 1; i <= money; i++) { // 使用最小币值,需要的硬币数量是最多的 int mn = i; // 遍历每一种面值的硬币 for (int kind = 0; kind < kinds; kind++) { // 若当前面值的硬币小于总额则分解问题并查表 if (val[kind] <= i) { int temp = cnt[i - val[kind]] + 1; if (temp < mn) { mn = temp; } } else { break; } } // 保存最小硬币数 cnt[i] = mn; cout << "面值为 " << i << " 的最小硬币数 : " << cnt[i] << endl; }}int main(){ // 硬币面值预先已经按升序排列 int value[] = {1,5,11}; // 需要的金额(15用动态规划得到的是3,用贪心得到的是5(11+1+1+1+1) int money = 15; // 保存每一个金额所需的最小硬币数,0号单元舍弃不用,所以要多加1 int cnt[money + 1]; dp(value, sizeof/sizeof, money, cnt); return 0;}

运行结果:

面值为1的最小硬币数:1面值为2的最小硬币数:2面值为3的最小硬币数:3面值为4的最小硬币数:4面值为5的最小硬币数:1面值为6的最小硬币数:2面值为7的最小硬币数:3面值为8的最小硬币数:4面值为9的最小硬币数:5面值为10的最小硬币数:2面值为11的最小硬币数:1面值为12的最小硬币数:2面值为13的最小硬币数:3面值为14的最小硬币数:4面值为15的最小硬币数:3

眼馋肚饱是求局地最优,但不分明是大局最优。若想全局最优,必需评释。dp是透过有个别意况来说述一些子标题,然后经过情景之间的改变到求解。日常若是退换方程是不利的,答案肯定是不利的。

动态规划本质上是穷举法,只是不重复总括罢了。结果是最优的。复杂度高。贪心算法不自然最优。复杂度日常极低。

贪欲只选用当前最利于的,不思量那步选用对之后的选项变成的熏陶,眼光短浅,无法见到全局最优;动规是因此不大圈圈的部分最优解一步步末尾得出全局最优解。

从推导进程来看,动态规划是贪心的泛化,贪心是动态规划的特例

踏入少儿消息学奥赛学习QQ群请扫侧面二维码,关心微教徒人号请扫左侧二维码

云顶游戏网站 1QQ群和公众号.png

package algorithm;/** * Project:Kotlin * Package:algorithm * Author:SKFsky * Description: 排序,冒泡排序和选择排序及二分查找 */public class algorithm_sort { public static void main(String[] args) { demo1()//冒泡排序 //demo2();//选择排序 } public static void demo1(){ int[] arr = {24, 69, 80, 57, 13}; int temp = 0; for (int i = 0;i<arr.length-1;i++) { for (int j = 0;j<arr.length-i-1;j++) { if (arr[j]>arr[j+1]){ temp = arr[j+1]; arr[j+1] = arr[j]; arr[j] = temp; } } } for (int i = 0;i<arr.length;i++) { System.out.println; } }}

9.史上最简便的 Spring MVC 教程

上边提到了,javafx.beans.property包下的类的安排中都带有了对可观望性和绑定的内建援救,大家能够增进二个监听器来监听属性的变动:

商家的app里面须要加三个排行的榜单的机能,做完事后,分享给大家

分析

遇见这种难点,大家很当然会纪念先用最大的面值,再用次大的面值……那样获得的结果为五个11元,叁个5元,一个1元,总共是八个硬币。

  • 要求: 对数组成分:{24, 69, 80, 57, 13}举行分选排序

  • 分析:第一次arr[0]和arr[1],arr[0]和arr[2],arr[0]和arr[3],arr[0]和arr[4],正如四遍,求出arr[0]最小值16,下一次排序不带最小值第二次arr[1]和arr[2],arr[1]和arr[3],arr[1]和arr[4],正如二次,求出arr[1]最小值24,下一次排序不带最小值第三次arr[2]史上最简易的,使用redis设计三个排名榜。和arr[3],arr[2]云顶游戏网站,和arr[4],正如四次,求出arr[2]小小值35,后一次排序不带最小值第四次arr[3]和arr[4],正如贰遍,求出arr[2]小小的值70,相比较截至

  • 图解:

    云顶游戏网站 2image.png

  • 运作结果:

    云顶游戏网站 3image.png

  • 代码体现:

3.史上最简易的 Spring MVC 教程

利用低档绑定api

低端API相比较高档API为开拓者提供了更加高的得心应手。

public class Main { public static void main(String[] args) { final DoubleProperty a = new SimpleDoubleProperty; final DoubleProperty b = new SimpleDoubleProperty; final DoubleProperty c = new SimpleDoubleProperty; final DoubleProperty d = new SimpleDoubleProperty; DoubleBinding db = new DoubleBinding() { { super.bind(a, b, c, d); } @Override protected double computeValue() { return  * b.get +  * d.get; } }; System.out.println; b.set; System.out.println; }}

利用低端API包罗对某多个绑定类举办增加同仁一视写其computeValue()方法以回到绑定的当前值。上例中行使了DoubleBinding 的三个自定义子类。子类中调用super.bind()方法将借助变量向上传递给了DoubleBinding类,所以默许的失灵行为会被保留。通常没有需要检讨绑定是或不是是失效;基类会为您提供这种作为。

程序

#include<stdio.h>void greed(int val[],int kinds,int total);int main(){ int value[] = {11, 5, 1}; int n = sizeof/sizeof; greed(value, n, 28); return 0;}/** val[]:存放可供找零的面值,降序排列* kinds:可供找零的面值种类数* total:需要的总金额*/void greed(int val[],int kinds,int total){ int i; for(i = 0; i < kinds; i++) { while(total >= val[i]) { printf("%d ", val[i]); total -= val[i]; } }}

运转结果:

11 11 5 1
  • 急需: 对数组成分:{24, 69, 80, 57, 13}实行冒泡排序

  • 分析: 相邻成分两两相比,大的以后放,第一回甘休最大值出现在了最大索引处。第一次比较arr[0]和arr[1]、arr[1]和arr[2]、arr[2]和arr[3]、arr[3]和arr[4];比较4次,得出最大数80第二次比较arr[0]和arr[1]、arr[1]和arr[2]、arr[2]和arr[3];比较3次,得出最大数69第三次比较arr[0]和arr[1]、arr[1]和arr[2];比较2次,得出最大数57第四次比较arr[0]和arr[1];得出最大值24,比较1次,比较形成经过那深入分析大家能够清楚5个数只供给比较4次,所以外层要求通过叁个for循环去决定,循环的次数正是arr.length-1。总共大家须要相比较四大次,可是在首先大次中,还须要相比四小次。然后第二大次中,还索要相比较三小次,依次类推,大家能够取得一个原理,只要深入分析出思路,接下去的代码是轻易完毕的了。

  • 图解

    云顶游戏网站 4image.png

  • 运作结果

    云顶游戏网站 5image.png

  • 代码

5.史上最简易的 Spring MVC 教程

import javafx.beans.property.DoubleProperty;import javafx.beans.property.SimpleDoubleProperty;class Bill { // 定义一个变量存储属性 private DoubleProperty amountDue = new SimpleDoubleProperty(); // 定义一个getter方法获取属性值 public final double getAmountDue(){return amountDue.get();} // 定义一个setter方法设置属性值 public final void setAmountDue(double value){amountDue.set;} // 定义一个getter方法获取属性本身 public DoubleProperty amountDueProperty() {return amountDue;}}

本文由云顶最新线路检测发布,转载请注明来源

关键词: