首页 文章 精选 留言 我的

精选列表

搜索[流量结构],共10000篇文章
优秀的个人博客,低调大师

android—使用Expandable实现三级树形结构

activity中加载系统自带的ExpandableListView; 自定义一个CustomExpandableListView作为ExpandableListView的子Item; CustomExpandableListView中重写onMeasure()方法: protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } 该方法是控制ExpandableListView显示高度,上面代码实现了ExpandableListView将所有的Item都显示,但是有一个问题: 例如:List A的item是CunstomExpandableListView B,B共有10item,则如果B的item也是CustomExpandableListView C,则C展开的item数count1与B能显示的Item数count2之和为10; 这样可以实现三级,再多就不会弄了; 注:这本来是要写一个动态的n层的ExpandableListView但是当子ExpandableListView展开时不能控制好Group的高度;所以放弃了,寻找其他的实现方式; 本文转自wauoen51CTO博客,原文链接:http://blog.51cto.com/7183397/1603658 ,如需转载请自行联系原作者

优秀的个人博客,低调大师

一些数据结构的思想(3)

随机函数发生器的设计 假设你希望以各1/2的概率输出0和1.你可以自由使用一个输出0或1的过程BIASED-RANDOM。它以概率p输出1,以概率1 - p输出0,其中 0 < p < 1,但是你并不知道p的值。给出一个利用BIASED-RANDOM作为子程序的算法,返回一个无偏向的结果,即以概率1/2返回0,以概率1/2返回1。作为p的函数,你的算法的期望运行时间是多少? 算法分析: 已知BIASED-RANDOM可产生0和1,那么 1 - BIASED-RANDOM也产生1和0,且以1 - p的概率输出1,以p的概率输出0。 如果我们将1 - BIASED-RANDOM看做另外一个函数发生器,和BIASED-RANDOM组合成对被调用,有以下结论: 调用结果 00 01 10 11 1的个数 0 1 1 2 出现概率 (1-p)*(1-p) (1-p)*(1-p) p*p p*(1-p) 那么,进行一次调用,出现1的个数的期望值为: 0 * (1-p)*(1-p) + 1 * (1-p)*(1-p) + 1 * p*p + 2 * p*(1-p) = 1。进行4次成对调用,则1的期望个数为4。为什么要调用4次呢?因为BIASED-RANDOM产生0的概率和 1 - BIASED-RANDOM产生1的概率相等;BIASED-RANDOM产生1的概率和 1 - BIASED-RANDOM产生0的概率相等,那么4次刚好覆盖了所有组合对(00,01,10,11),也可进行8次,16次等调用。当进行4次成对调用后,统计1出现的个数,若小于4次,则返回0;大于4次,则返回1(这里相当于将4次调用封装为了一个函数)。但有个问题,等于4次该返回0还是1呢?(因为1的可能次数为0至8)所以,可进行大量成对调用,以使单个现象可被忽略。如,进行1024次调用,统计1的个数,小于1024返回0,否则返回1。 随机概率发生器 题目: 已知一随机发生器,产生0的概率是p,产生1的概率是1-p,现在要你构造一个发生器,使得它构造0和1的概率均为1/2 解决方案: 这是随机概率发生器的典型题目。 由于需要产生1/2,而用1位0,或1位1无法产生等概率,因此,考虑将随机数扩展成2位: 00 p*p 01 p*(1-p) 10 (1-p)*p 11 (1-p)*(1-p) 有上述分析知道,01和10是等概率的,因此我们只需要产生01和10就行了。 于是可以,遇到00和11就丢弃,只记录01和10。可以令,01表示0,10表示1,则等概率1/2产生0和1了。 扩展: 已知一随机发生器,产生0的概率是p,产生1的概率是1-p,现在要你构造一个发生器,使得它构造0和1的概率均为1/2;构造一个发生器,使得它构造1、2、3的概率均为1/3;...,构造一个发生器,使得它构造1、2、3、...n的概率均为1/n,要求复杂度最低。 解答: 对n=2,认为01表示0、10表示1,等概率,其他情况放弃 对n=3,认为001表示1、010表示2,100表示3,等概率,其他情况放弃 对n=4,认为0001表示1、0010表示2,0100表示3,1000表示4,等概率,其他情况放弃 首先是1/2的情况,我们一次性生成两个数值,如果是00或者11丢弃,否则留下,01为1,10为0,他们的概率都是p*(1-p)是相等的,所以等概率了。然后是1/n的情况了,我们以5为例,此时我们取x=2,因为C(2x,x)=C(4,2)=6是比5大的最小的x,此时我们就是一次性生成4位二进制,把1出现个数不是2的都丢弃,这时候剩下六个:0011,0101,0110,1001,1010,1100,取最小的5个,即丢弃1100,那么我们对于前5个分别编号1到5,这时候他们的概率都是p*p*(1-p)*(1-p)相等了。 关键是找那个最小的x,使得C(2x,x)>=n这样能提升查找效率 平均要取多少个(0,1)中的随机数才能让和超过1 数学常数最令人着迷的就是,它们常常出现在一些看似与之毫不相干的场合中。 随便取一个 0 到 1 之间的数,再加上另一个 0 到 1 之间的随机数,然后再加上一个 0 到 1 之间的随机数⋯⋯直到和超过 1 为止。一个有趣的问题:平均需要加多少次,才能让和超过 1 呢?答案是 e 次。 #define NUM 9999999 int main() { int sum=0; srand(time(NULL)); for (int i=0;i<NUM;i++) { double val=0; while(val <1) { val+=(rand()/(double)RAND_MAX); sum++; } } printf("%f\n",sum/(double)NUM); return 0; } 为了证明这一点,让我们先来看一个更简单的问题:任取两个 0 到 1 之间的实数,它们的和小于 1 的概率有多大?容易想到,满足 x+y<1 的点 (x, y) 占据了正方形 (0, 1)×(0, 1) 的一半面积,因此这两个实数之和小于 1 的概率就是 1/2 。类似地,三个数之和小于 1 的概率则是 1/6 ,它是平面 x+y+z=1 在单位立方体中截得的一个三棱锥。这个 1/6 可以利用截面与底面的相似比关系,通过简单的积分求得: 可以想到,四个 0 到 1 之间的随机数之和小于 1 的概率就等于四维立方体一角的“体积”,它的“底面”是一个体积为 1/6 的三维体,在第四维上对其进行积分便可得到其“体积” ∫(0..1) (x^3)*1/6 dx = 1/24 依此类推, n 个随机数之和不超过 1 的概率就是 1/n! ,反过来 n 个数之和大于 1 的概率就是 1 - 1/n! ,因此加到第 n 个数才刚好超过 1 的概率就是 (1 - 1/n!) - (1 - 1/(n-1)!) = (n-1)/n! 因此,要想让和超过 1 ,需要累加的期望次数为 ∑(n=2..∞) n * (n-1)/n! = ∑(n=1..∞) n/n! = e x&(x-1)表达式的意义 求下面函数的返回值(微软) -- 统计1的个数 int func(int x) { int countx = 0; while(x) { countx++; x = x&(x-1); } return countx; } 假定x = 9999 10011100001111 答案: 8 思路: 将x转化为2进制,看含有的1的个数。 注:每执行一次x = x&(x-1),会将x用二进制表示时最右边的一个1变为0,因为x-1将会将该位(x用二进制表示时最右边的一个1)变为0。 判断一个数(x)是否是2的n次方 #include <stdio.h> int func(int x) { if( (x&(x-1)) == 0 ) return 1; else return 0; } int main() { int x = 8; printf("%d\n", func(x)); } 注: (1)如果一个数是2的n次方,那么这个数用二进制表示时其最高位为1,其余位为0。 (2)== 优先级高于& 本文转自我爱物联网博客园博客,原文链接:http://www.cnblogs.com/yydcdut/p/3878319.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

hive改表结构的两个坑

坑一:改变字段类型后更新数据不成功 关于hive插入数据的一个小坑,今天插入一个表中数据,插入时写的是常数,比如0.01 ,表中的字段也是DECIMAL(5,2) 按照常理插入的应该是0.01,但是插入后查询是0,为甚! 就分析呀,看语句没问题啊,上网查,上hive官网查,呀~ 发现了原因哦 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-Decimals 发现在插入分区表时会出现这种情况,此时需要对之前的分区处理下~: 那就测试一下 按照官网的说法: 先建表: CREATE TABLE `tb_dw_cu_mimsg_fbi_servdt_day1`( `mimsg_serv` int COMMENT '微信服务量') PARTITIONED BY ( `statis_date` varchar(8)) ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' ; 然后插入数据: insert overwrite table tb_dw_cu_mimsg_fbi_servdt_day1 partition (statis_date=20160501) values(1.02); 然后查询: hive> select * from tb_dw_cu_mimsg_fbi_servdt_day1; OK 1 20160501 发现结果跟想象中的一样~ 然后修改表字段: ALTER TABLE tb_dw_cu_mimsg_fbi_servdt_day1 REPLACE COLUMNS (mimsg_serv DECIMAL(5,2)) 然后再次插入数据: insert overwrite table tb_dw_cu_mimsg_fbi_servdt_day1 partition (statis_date=20160501) values(1.02); 查询: hive> select * from tb_dw_cu_mimsg_fbi_servdt_day1; OK 1 20160501 发现有问题啦! 那么按照官网处理: Determine what precision/scale you would like to set for the decimal column in the table. For each decimal column in the table, update the column definition to the desired precision/scale using theALTER TABLEcommand: ALTERTABLEfoo CHANGECOLUMNdec_column_name dec_column_nameDECIMAL(38,18); If the table is not a partitioned table, then you are done. If the table has partitions, then go on to step 3. If the table is a partitioned table, then find the list of partitions for the table: SHOW PARTITIONS foo; ds=2008-04-08/hr=11 ds=2008-04-08/hr=12 ... Each existing partition in the table must also have its DECIMAL column changed to add the desired precision/scale. This can be done with a singleALTER TABLE CHANGE COLUMNby using dynamic partitioning (available for ALTER TABLE CHANGE COLUMN in Hive 0.14 or later, withHIVE-8411): SEThive.exec.dynamic.partition =true; -- hive.exec.dynamic.partition needs to be set to true to enable dynamic partitioning with ALTER PARTITION -- This will alter all existing partitions of the table - be sure you know what you are doing! ALTERTABLEfoo PARTITION (ds, hr) CHANGECOLUMNdec_column_name dec_column_nameDECIMAL(38,18); 这里对表作如下处理: ALTER TABLE tb_dw_cu_mimsg_fbi_servdt_day1 PARTITION (statis_date) CHANGE COLUMN mimsg_serv mimsg_serv DECIMAL(5,2); 再次插入数据: insert overwrite table tb_dw_cu_mimsg_fbi_servdt_day1 partition (statis_date=20160501) values(1.02); 然后查询: hive> select * from tb_dw_cu_mimsg_fbi_servdt_day1; OK 1.02 20160501 Time taken: 0.066 seconds, Fetched: 1 row(s) 发现结果跟想象中的一样了。这个坑算是过去了~ 坑二:增加字段后更新数据不成功 还是上面的例子那张表,再增加一个字段: alter table tb_dw_cu_mimsg_fbi_servdt_day1 add COLUMNS (prov_code varchar(5)) 然后查询 hive> select * from tb_dw_cu_mimsg_fbi_servdt_day1; OK 1.02 NULL 20160501 Time taken: 0.082 seconds, Fetched: 1 row(s) 发现新增的字段默认的值是NULL,现在我重新覆盖一下元数据,给增加的字段一个值: insert overwrite table tb_dw_cu_mimsg_fbi_servdt_day1 partition(statis_date=20160501) values (2.01,0371); 然后查询: hive> select * from tb_dw_cu_mimsg_fbi_servdt_day1; OK 2.01 NULL 20160501 发现还是NULL 不是我们想象的结果,查看一下官方文档说明发现了问题的所在: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-Add/ReplaceColumns ALTER TABLE ADD or REPLACE COLUMNS CASCADE will override the table partition's column metadata regardless of the table or partition's protection mode. Use with discretion. 那就这样处理: alter table tb_dw_cu_mimsg_fbi_servdt_day1 replace COLUMNS (mimsg_serv decimal(5,2),prov_code varchar(5)) CASCADE; 直接查询,发现数据显示的数据已经发生了变化了~ hive> select * from tb_dw_cu_mimsg_fbi_servdt_day1; OK 2.01 0371 20160501 综上发现,我们是按照Oracle这样的标准在考虑H-SQL,但是通过阅读官方文档发现二者之间还是有很大不同的,通过这次踩坑发现,仔细阅读官方文档的重要性!!!

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册