-
Python 利用中间值求TopK 算法
2019-11-04 21:57:05Python 中间值求TopK算法 算法思想以下以找出TopK 的最大值为例,最小值的可以自己修改一下下就可以重点就是找出这个中间值如何找出中间值结合代码和注释看 算法思想 首先我们要思考,我要做什么?解决什么问题? ...Python 中间值求TopK算法
算法思想
首先我们要思考,我要做什么?解决什么问题?
TopK问题,找出一组数据中的前K个最大值或者最小值,这个数据是否重复?要做去重处理?
ok 我们明确我们做什么了 ,那介绍的python处理的topK 算法过程是怎么样的呢?
~~要找出前K个最大值最小值我们可以用排序来做,然后用切片去完事了~~ 如果用排序那就没必要引入topK 了,当数据强大的时候选取TopK 可以省略很多排序的计算,至于有多优化自己去思考下,就比如排列组合的C,A的区别,一个是抽取,一个是抽取并排列…以下以找出TopK 的最大值为例,最小值的可以自己修改一下下就可以
介绍的算法思想是利用中间值,将数列分为三部分 ,
【比中间值大的列表】,中间值,【比中间值小的列表】那么我们当比较
【比中间值大的列表】的个数 == k
的时候就可以得出前K个最大值了,因此重点就是找出这个中间值
如何找出中间值
以列表的第一个数开始为中间值,拆分为三部分
if 【比中间值大的列表】的个数 == k:return 中间值 #程序出口,结束。if 【比中间值大的列表】的个数 < k :
·····继续在【比中间值小的列表】找
·····K - 【比中间值大的列表】的个数 -1 个数
(为什么要减一,1是前一次的中间值,分的三部分,前部分后部分都没有包含中间值,因此…)
if 【比中间值大的列表】的个数 > k :
…也就是说比中间值大的列表比K还大,那就在这个列表中继续找就行结合代码和注释看
,如果要找最小值,只需要改一下就ok ,还可以设置一个布尔值的输入,来做前K个最大值最小值
#2019 11 04 #author 半斤地瓜烧 #TopK 算法,找出序列中前K个最大值的 #输入一个seq # 输出以seq[0]为中间值 划分的三个部分,中间值,比这个值大的seq ,比这个值小的seq, # 即splitNum,theBig,theSmall def Split_Seq(seq): splitNum = seq[0] seq = seq[1:]#两个部分都不包含中间值,因此切片去除seq[0] theBig = [x for x in seq if x >= splitNum] theSmall = [x for x in seq if x < splitNum] return splitNum,theBig,theSmall #找出中间值 def topKNum(seq,k): splitNum, theBig, theSmall = Split_Seq(seq) theBigLen = len(theBig) if k == theBigLen: return splitNum#出口,返回这个中间值, # 为什么不直接返回thebig?因为存在递归的原因thebig 不是在初始的seq找出来的 #需要重新Split,即可,读者自己思考 # 大值的列表中还未够K个数的情况, if k > theBigLen: return topKNum(theSmall,k-theBigLen-1) # 大值的列表中大于K个数的情况 return topKNum(theBig,k) #由中间值找出TopK个值,<list> def getTopK(seq,k): return [i for i in seq if i > topKNum(seq, k)] if __name__ == '__main__': alist = [7, 3, 5, 1,885,234,2211,222,22, 2, 11, 2, 115] print("===为了验证,引入排序观看===", sorted(alist,reverse= True)) print(getTopK(alist, 3))
-
求三个数值的中间值的宏定义
2015-05-15 22:20:19怎么用一个宏来求三个数值的中间值呢?请看:怎么用一个宏来求三个数值的中间值呢?请看:
#include <stdio.h> #define MIDDLE(x,y,z) \ ((x)<(y)?((y)<(z)?(y):(x)<(z)?(z):(x)):((y)>(z)?(y):(x)>(z)?(z):(x))) int main(void) { printf("MIDDLE(%d,%d,%d) = %d\r\n", 1,2,3,MIDDLE(1,2,3)); printf("MIDDLE(%d,%d,%d) = %d\r\n", 2,1,3,MIDDLE(2,1,3)); printf("MIDDLE(%d,%d,%d) = %d\r\n", 1,3,2,MIDDLE(1,3,2)); printf("MIDDLE(%d,%d,%d) = %d\r\n", -1,-2,-3,MIDDLE(-1,-2,-3)); printf("MIDDLE(%d,%d,%d) = %d\r\n", -2,-1,-3,MIDDLE(-2,-1,-3)); printf("MIDDLE(%d,%d,%d) = %d\r\n", -1,-3,-2,MIDDLE(-1,-3,-2)); printf("MIDDLE(%f,%f,%f) = %f\r\n", 1.1,2.4,3.5,MIDDLE(1.1,2.4,3.5)); printf("MIDDLE(%f,%f,%f) = %f\r\n", 1.1,3.3,2.4,MIDDLE(1.1,3.3,2.4)); printf("MIDDLE(%f,%f,%f) = %f\r\n", 2.4,1.1,3.3,MIDDLE(2.4,1.1,3.3)); return 0; }
可见结果均正确!
-
求Fibbonacci级数的中间指定的项的值问题,运用C语言的程序编写的方式怎么做
2019-03-26 16:27:39Problem Description Your objective for this question is to develop a program which will generate a fibbonacci number. The fibbonacci function is defined as such: f(0) = 0 f(1) = 1 ... -
java 获取两颜色值的中间值
2017-06-13 19:39:58有时候做项目的时候,需要动态的计算两颜色值之间的中间值,然后做出一定的效果,那么该怎么求呢? 下面说说做法: 简单而言,就是需要对两颜色之间的求和再取平均值,但是直接使用color.parseInt再求和除2是...有时候做项目的时候,需要动态的计算两颜色值之间的中间值,然后做出一定的效果,那么该怎么求呢?
下面说说做法:
简单而言,就是需要对两颜色之间的求和再取平均值,但是直接使用color.parseInt再求和除2是不对的,因为直接求和会导致颜色不对,具体原因出自相加求和颜色退位。
那么,该如何算呢,贴下代码:
public static String getMiddleColor(String color1, String color2) { if (color1.contains("#") && color2.contains("#") && color1.length() == color2.length() && color2.length() == 7) { String tempColor1 = color1.replace("#", ""); String tempColor2 = color2.replace("#", ""); StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append("#"); for (int i = 0; i < tempColor1.length(); i++) { String tempResult = (changeHex2Int(String.valueOf(tempColor1.charAt(i))) + changeHex2Int(String.valueOf(tempColor2.charAt(i)))) / 2 + ""; stringBuffer.append(changeInt2Hex(tempResult)); } return stringBuffer.toString(); } return ""; }
简单的说就是根据6位的颜色直接逐个逐个的求和再除二,那么这个颜色值就是对的了。private static int changeHex2Int(String temp) { BigInteger srch = new BigInteger(temp, 16); return Integer.valueOf(srch.toString()); } private static String changeInt2Hex(String temp) { BigInteger srch = new BigInteger(temp, 10); return Integer.toHexString(Integer.parseInt(srch.toString())); }
如此一来,就能实现一个比较困难的需求,用曲线救国的方式实现我们的功能要求了。感谢你的浏览。
-
给出一个单链表,不知道节点N的值,怎么遍历一次就可以求出中间节点
2013-06-09 10:36:35设立两个指针,比如*p和*q,p每次移动一个位置,q每次移动两个位置,q到达最后一个节点时,p到达中间节点设立两个指针,比如*p和*q,p每次移动一个位置,q每次移动两个位置,q到达最后一个节点时,p到达中间节点
-
输入n个数字,并求出它们中间的最大值与最小值
2019-04-26 22:16:35既然是n个数,那么肯定就要有输入,定义一个数组a[5] 来接收从键盘输入的数字,怎么将接收的数值依次传入数组呢?利用for循环,将其依次存入a数组。输入完成,接下来就是要实现具体功能了 将问题模块化,把功能与... -
表达式求值
2019-07-30 21:15:24今天上课,老师教了小易怎么计算加法和乘法,乘法的...现在小易希望你帮他计算给定3个数a,b,c,在它们中间添加”+”, “*”, “(“, “)”符号,能够获得的最大值。 输入描述 一行三个数 \(a,b,c (... -
Stream中间是怎么执行的 java8流式编程
2021-01-11 20:03:47如果Stream只有中间操作是不会执行的,当执行终端操作的时候才会执行中间操作,这种方式称为延迟加载或惰性求值。多个中间操作组成一个中间操作链,只有当执行终端操作的时候才会执行一遍中间操作链,具体是因为什么我们... -
中缀表达式求值问题
2017-10-25 09:24:35中缀表达式的求值问题是一个比较常见的问题之一,我们通常在编写程序时,直接写出表达式让编译器去处理,很少去关心编译器是怎么对表达式进行求值的,今天我们来一起了解一下其中具体的原理和过程。 表达式... -
C++ 表达式求值
2019-07-20 13:19:46题目描述 今天上课,老师教了小易怎么计算加法和乘法,...现在小易希望你帮他计算给定3个数a,b,c,在它们中间添加"+", "*", "(", ")"符号,能够获得的最大值。 输入描述: 一行三个数a,b,c (1 <= a, b,... -
表达式求值 java
2019-07-02 16:26:46题目描述 今天上课,老师教了小易怎么计算加法和乘法,...现在小易希望你帮他计算给定3个数a,b,c,在它们中间添加"+", "*", "(", ")"符号,能够获得的最大值。 输入描述: 一行三个数a,b,c (1 <= a, b,... -
[编程题]表达式求值
2019-09-04 15:00:20[编程题]表达式求值 今天上课,老师教了小易怎么计算加法和乘法,乘法的优先级大于加法,但是如果一个运算加了括号,那么它的优先级是最高的。例如: 12341+2*3=71*(2+3)=51*2*3=6(1+2)*3=9 现在小易希望你帮他... -
006网易-表达式求值
2019-09-28 10:17:03问题描述: 今天上课,老师教了小易怎么计算...现在小易希望你帮他计算给定3个数a,b,c,在它们中间添加"+", "", “(”, ")"符号,能够获得的最大值。 输入描述: 一行三个数a,b,c (1 <= a, b, c <= ... -
C#如何获取javascript中函数的中间变量的值
2016-10-07 13:05:43网页的javascript代码中有一个函数 其中有一个变量address我想得到这个变量的值 怎么通过C#来实现。求大神解答。 -
java求两个数字中间的数字_EXCEL求区域中最后一个数字
2020-12-06 11:09:21一提到函数,很多人就很畏惧,最多只会用简单的函数,嵌套就不行了,很多人都在问我该怎么学习函数...开始案例之前先补充几个简单的函数:1)、求最大,最小MAX(number1,number2,...),返回参数中的最大值M I N(numb... -
中缀、前缀和后缀表达式求值问题
2014-08-06 09:02:31中缀表达式的求值问题是一个比较常见的问题之一,我们通常在编写程序时,直接写出表达式让编译器去处理,很少去关心编译器是怎么对表达式进行求值的,今天我们来一起了解一下其中具体的原理和过程。 表达式... -
【Java】网易表达式求值
2019-08-20 15:42:27题目描述 今天上课,老师教了小易怎么计算加法和...现在小易希望你帮他计算给定3个数a,b,c,在它们中间添加"+", "*", "(", ")"符号,能够获得的最大值。 输入描述: 一行三个数a,b,c (1 <= a, b, c <... -
校招真题练习026 表达式求值(网易)
2019-09-28 18:50:04表达式求值 题目描述今天上课,老师教了小易怎么计算加法和乘法,乘法的优先级大于加法,但是如果一个运算加了括号,那么它的优先级是最高的。例如:1+2*3=71*(2+3)=51*2*3=6(1+2)*3=9现在小易希望你帮他计算给定3... -
2019校招真题(1星) 表达式求值
2020-05-15 21:58:48现在小易希望你帮他计算给定3个数a,b,c,在它们中间添加"+", "", “(”, ")"符号,能够获得的最大值。 输入描述: 一行三个数a,b,c (1 <= a, b, c <= 10) 输出描述: 能够获得的最大值 示例1 输入 1 2 3 ... -
表达式求值(2019网易编程题)
2018-08-15 21:11:02今天上课,老师教了小易怎么计算加法和乘法,乘法的优先级大于加法,但是如果一个运算加了括号,那么它的优先级是最高的。例如: 1 2 3 4 1+2*3=7 1*(2+3)=5 1*2*3=6 (1+2)*3=9 现在小易希望你帮他计算给定3个数a... -
牛客--2019网易--表达式求值
2020-03-23 19:49:45题目描述: 今天上课,老师教了小易怎么计算...现在小易希望你帮他计算给定3个数a,b,c,在它们中间添加"+", "", “(”, ")"符号,能够获得的最大值。 输入描述: 一行三个数a,b,c (1 <= a, b, c <= 10)... -
牛客,剑指offer,表达式求值
2019-09-09 12:33:23package test; import java.util.Scanner; /** * 今天上课,老师教了小易怎么计算加法和乘法,乘法的优先级大于加法...现在小易希望你帮他计算给定3个数a,b,c,在它们中间添加"+", "*", "(", ")"符号,能够...
-
LeetCode 206. 反转链表(C++) 迭代
-
培训师职业生涯规划.ppt
-
Windows系统管理
-
电子卡-源码
-
批量生成二维码.rar
-
程序员必修基础套餐课
-
Galera 高可用 MySQL 集群(PXC v5.7+Hapro)
-
计划与合理安排PPT.ppt
-
libFuzzer视频教程
-
spark大数据分析与实战
-
NFS 实现高可用(DRBD + heartbeat)
-
如何做好培训效果评估.pdf
-
MySQL你该了解的那些事【服务端篇】
-
Redis有哪些优缺点
-
一天学完MySQL数据库
-
如何建立和拓展企业内部培训体系.ppt
-
洛谷P2550 [AHOI2001]彩票摇奖经典解法
-
mysql 多表连接 聚合函数
-
去哪里看 ECMAScript 最新标准?
-
day18作业(1)