首页 > 试题广场 >

设计一个存储结构来保存淘宝上的每个宝贝的所有邮费信息。

[问答题]
淘宝上的每个宝贝一般都有个默认的全国邮费(也可能没有),同时也支持到特定省份有特定的邮费,如果到特定的省份没有特别的邮费就用默认的全国邮费。请:
 1.设计一个存储结构来保存一个宝贝的所有邮费信息;(简单用文字阐述一下做法)
 2.给定一个宝贝的邮费存储信息和一个省份,编程快速得出宝贝到此省的邮费。 注意:邮费的类型是uint32_t,此外由于商品数量非常大(假定十亿量级),查询量也非常大,对存储和查询的效率要求非常高,因此存储效率和查询效率是考察的重点。
我想的是采用数据库中的Hash索引实现,以宝贝id和省份id得到一个hash值,然后通过hash索引搜索,如果得到的值不为空表示该宝贝到该省存在特殊值,否则为默认值,不知能不能行?
发表于 2017-07-27 21:30:11 回复(0)
感觉题目没描述清楚,所述为个人观点
如果说运费是按地区统一规划的,假设10亿的宝贝来自34个省,也就是每个省有一批商家,贩卖一批宝贝。一个地区(对应一个唯一的area_id)的宝贝对外销售,运费分为特殊地区运费、统一运费、无运费。我们只需要记录特殊地区的运费和无运费这两种情况,也就是不考虑宝贝id,只用考虑宝贝的产地,对所在地区的宝贝运费做规划。并用map存起来。

定义一个Map<Integer,Map<Integer,Double>> map结构存储即可。
比如对应一个宝贝 x ,我们根据它的产地id,得到该地区范围内,对外的运费map,再根据顾客定单填下的地区id,从Map中找到对应的price,若get为空,则为全国统一运费。

编辑于 2018-08-19 22:31:10 回复(0)
//假设34个省的id为0--33
struct postage_info{
    uint64_t mask;//总共34各省,用34位表示每个省的邮费是不是默认,是的话对应位为1
    struct postage *p; //用一个数组存储非默认省份的价格,假设此数组按province_id的大小已经排好序了
    uint32_t default; //默认价格
}
struct postage{
  int province_id;  // 省id
  int postage;      //邮费
}
uint32_t get_postage(int province_id, struct postage_info * info){
       if(1<<province_id & info->mask)
            return info->default;
      else
            return bsearch(province_id, info->p)//... 使用二分查找获取对应省份的邮费
}

编辑于 2018-08-09 16:23:55 回复(3)
个人思路:
第一点:考虑集群不?
一个应用服务器负责存储一个省的运费计算,根据请求在到对应服务器上获取。
假设不考虑集群,就一个服务来计算。
第二点:存储结构
如果一个省对应一个uint32_t的邮费,中国34个省,存储空间就是136字节。10亿个商品。。粗略算一下有 , 应该是10^11byte量级,。前面都是根据省来映射价格。首先先考虑平时逛淘宝实际情况,根据业务情况来分析,其实淘宝大部分的商品都是全国统一邮费。而且就算是定义特殊邮费也不是按照某个具体的省,一般都是一个区,比如 江浙沪什么的。那么是不是可以反过来,使用价格来映射省份。uint32_t ->uint64_t(用某一个位代表某个省)。 最优的情况下,就是所有都是默认价格,存储的空间就只是 12字节。当然,最坏的情况,就是每个省一个价格,占的空间就12*34=408字节。不过就平均而言我感觉肯定不会有这么多蛋疼的商家。
第三点:查询效率。
如果位运算的时间O(1),那么查询理论上是O(1)
发表于 2017-07-23 17:52:15 回复(2)
import java.util.*;

public class Main{ 
    public static void main(String[] args){

    }  }

发表于 2019-03-21 21:42:57 回复(0)
 
发表于 2018-09-06 11:14:28 回复(0)
省份、市(自治州)、区、街道、门牌号
分别对以上地址进行哈希映射能够快速找出地址。

其次, 对省市区街道门牌号 分段累加计费。
发表于 2017-08-23 21:06:08 回复(0)