作业总结四

一、数据结构与算法4

4、遍历算法应用

二叉树的遍历算法运算是一个重要的基础,对访问根结点操作的理解可包括各种各样的操作。在下面的应用实例中,一是重点理解访问根结点操作的含义,二是注意具体实现时是否需要考虑遍历的次序选择要求。

1.输出二叉树中的结点

【算法思想】输出二叉树中的结点并无次序要求,因此可用三种遍历算法中的任何一种完成,只需将访问操作具体变为输出操作即可。下面给出先序遍历二叉树的实现算法。

【算法描述】 先序遍历输出二叉树中的结点

void PreOrder(BiTree root)

/*先序遍历输出二叉树结点,root为指向二叉树根结点的指针*/

{

if(root!=NULL)

{

print(root->data);  /*输出根结点*/

PreOrder(root->LChild);  /*先序遍历左子树*/

PreOrder(root->RChild);  /*先序遍历右子树*/

}

}

2.输出二叉树中的叶子结点

【算法思想】与输出二叉树中的结点相比,输出二叉树的叶子结点是一个有条件的输出问题,即在遍历过程中走到每一个结点时需要进行测试,看是否满足叶子结点的条件。故只需改变算法1的黑体部分,加上条件测试即可。

【算法描述】先序遍历输出二叉树中的叶子结点

void PreOrder(BiTree root)

/*先序遍历输出二叉树中的叶子结点,root为指向二叉树根结点的指针*/

{

if(root!=NULL)

{

if(root->LChild==NULL&&root->RChild==NULL)

print(root->data);  /*输出叶子结点*/

PreOrder(root->LChild);  /*先序遍历左子树*/

PreOrder(root->RChild);  /*先序遍历右子树*/

}

}

二、项目需求代码

--创建chat_data表
CREATE TABLE chat_data (
     MessageTime string,--消息时间
     SenderNickname VARCHAR(255),--发件人昵称
     SenderAccount VARCHAR(255),--发件人账号
     SenderGender VARCHAR(10),--发件人性别
     SenderIP VARCHAR(50),--发件人IP
     SenderIOS VARCHAR(255),--发件人系统
     SenderPhoneModel VARCHAR(255),--发件人手机型号
     SenderNetworkType VARCHAR(50),--发件人网络制式
     SenderGPS string,--发件人GPS
     RecipientNickname VARCHAR(255),--收件人昵称
     RecipientIP VARCHAR(50),--收件人IP
     RecipientAccount VARCHAR(255),--收件人账号
     RecipientIOS VARCHAR(255),--收件人系统
     RecipientPhoneModel VARCHAR(255),--收件人手机型号
     RecipientNetworkType VARCHAR(50),--收件人网络制式
     RecipientGPS string,--收件人GPS
     RecipientGender VARCHAR(10),--收件人性别
     MessageType VARCHAR(50),--消息类型
     DistanceBetween string,--双方距离
     MessageContent string--消息
                      );
load data  inpath '/user/chat_data-10W.csv' into table chat_data;--导入表格
drop table chat_data;--删除
--1、统计今日消息总量表
create table if not exists total_msg
    comment "今日消息总量"
    as select day, count(*)
        as total_msg_cnt
    from chat
    group by day;
drop table total_msg;
select * from total_msg;--结果验证
--3、统计今日每小时消息量、发送和接收用户数
create table if not exists hour_msg
    comment "每小时消息量趋势"
    as select day, hour, count(*) as total_msg_cnt,
              count(distinct SenderAccount) as sender_usr_cnt,
              count(distinct RecipientAccount) as receiver_usr_cnt
    from chat
    group by day,hour;
select * from hour_msg;--结果验证

--2、发送和接收用户数
create table if not exists table_usr
    comment "今日发送消息人数、接受消息人数" as select day,
    count(distinct SenderAccount) as sender_usr_cnt,
    count(distinct RecipientAccount) as receiver_usr_cnt from chat group by day;
select * from table_usr;

--4、统计今日发送消息最多的Top10用户
 create table if not exists usr_top10
     comment "发送消息条数最多的Top10用户" as select day, SenderNickname as username,
                                          count(*) as sender_msg_cnt
     from chat
     group by day,SenderNickname
     order by sender_msg_cnt desc limit 10;
select * from usr_top10; --结果验证

--5、统计发送人的设备操作系统分布情况
create table if not exists senderios
    comment "发送人的OS分布"
    as select day, SenderIOS, count(distinct SenderAccount) as cnt
    from chat group by day,SenderIOS;
select * from senderios; --结果验证

--6、统计发送人的手机型号分布情况
create table if not exists sender_phone
    comment "发送人的手机型号分布" as select day, SenderPhoneModel, count(distinct SenderAccount) as cnt
    from chat group by day,SenderPhoneModel;
select * from sender_phone; --结果验证

--7、统计发送人的网络类型分布情况
create table if not exists sender_net
    comment "发送人的网络类型分布情况" as select day, SenderNetworkType,
                                   count(*) as total_net_cnt
                            from chat group by day,SenderNetworkType;

--8、统计发送消息各地区数据量
create table if not exists area_msg
    comment "发送消息各地区数据量" as select day, SenderGPS,
                                    cast(sender_lng as double) as longitude,
                                    cast(sender_lat as double) as latitude,
                                    count(*) as total_msg_cnt
    from chat group by day,SenderGPS,sender_lng,sender_lat;
select * from area_msg; --结果验证
drop table area_msg;

--9、统计发送人的男女分布情况
create table if not exists sender_gender
    comment "发送人的网络类型分布情况" as select day, SenderGender,
                                     count(*) as total_gender_cnt
                              from chat group by day,SenderGender;

--10、统计每个时间段发信息的用户数量
create table if not exists time_msg
    comment "每个时间段发信息的用户数量"
as select MessageTime, count(*) as total_sender_cnt
   from chat
   group by MessageTime;
drop table time_msg;

--将Select语句的结果保存到新表中
create table chat
    as select *, substr(MessageTime,0,10) as day, --获取天
    substr(MessageTime,12,2) as hour, --获取小时
    split(SenderGPS,",")[0] as sender_lng, --提取经度
    split(SenderGPS,",")[1] as sender_lat --提取纬度
    from chat_data --过滤字段为空的数据
    where length(SenderGPS) > 0 ; --验证ETL结果
drop table if exists chat;--删除chat表

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值