滑动窗口协议的维基:
UDP 包大小理论上在 8 - 65535 byte ,IPv4 协议下数据域实际大小:65507 byte。
贾浩:利用 MySQL 特性来解决“写数据的原子性”。缺点:“原子性的写”可能是靠加锁实现,这也就大大降低了性能,因为 Unix 是分时系统。
我:应该根据用户量,酌情使用 redis 集群特性。使用 hashtable 数据结构,这样能在 O(1) 的时间复杂度内完成判断。使用“一致性 hash ”路由算法。 0~(2^{32}) 空间内,对用户ID进行模运算。
贾浩 A:利用 update 操作的原子性,预先设置抢购商品数量个令牌,当用户请求来时,先校验所剩的令牌数,有剩余表示该用户可以抢购。
UPDATE 抢购表 uid = $uid, token = 0 Where token = 1 and token = 1
我 A : MySQL 并发时,可以加写锁:最常用的两种引擎大概是 MyISAM 和 InnoDB,他们分别实现了表锁和行级锁。
令牌系统,不合理的请求在前端被档,不会到后端,保证了后端系统稳定。这也保证了 MySQL 写数据的原子性。A 2 : 令牌桶算法(Token Bucket)——网络流量整形、速率限制
贾浩:抢购系统原理 UPDATE 原子性 + token 预先分配
贾浩:为什么不用 PHP 原生特性?
我:使用 SPL 加载类,可以保证框架的完全面向对象特性,比如使用
Input::get('name');
URL::segement(3);
如果使用 call_user_func 必须先手动加载对应文件,所以 CI 框架会有丑陋的写法:
$this->load->('input'); //都需要先load
$this->input->get('name');$this->load->('url'); //需要先load
$this->url->segement(3);
解
容量为K的最小堆,时间复杂度O(N × logK),《编程之美》之“2.5寻找最大的K个数”。
解
用 bitset 改善“Power 8 极限算法挑战赛 第六期”程序,优化程序所使用的内存。优化后,空间占用减少到3MB。程序数据将会存储在CPU cache L3 中,数据相对CPU的“距离”越近、读写速度越快。
解
使用“多趟桶排序”进行排序。但技术总监面(二面时)否定了该解法。我后来反思觉得,用多趟桶排序还是能解的!(具体解法有待后续更新)
2016年6月28日更新:
利用B树也是很好的解决方式,而且很多成熟的方案(比如MySQL)都是在利用B树的变种来组织数据。首先,生成B树、然后从小到大地层序遍历,这样就相当于进行了排序。
int MaxSubString(int* A, int n)
{int Start = A[n - 1];int All = A[n - 1];for (int i = n - 2; i >= 0; i--) //从后向前遍历,反之亦可。{Start = max(A[i], A[i] + Start);All = max(Start, All);}return All; //All[0] 中存放结果
}
参考资料:.html
解:
它的实现是在 Zend/zend.h 文件中。:
struct _zval_struct {zvalue_value value; /* 变量的值 */zend_uint refcount__gc;zend_uchar type; /* 变量当前的数据类型 */zend_uchar is_ref__gc;
};
typedef struct _zval_struct zval;//在Zend/zend_types.h里定义的:
typedef unsigned int zend_uint;
typedef unsigned char zend_uchar;
保存变量值的value则是zvalue_value类型(PHP5),它是一个union,同样定义在了Zend/zend.h文件里:
typedef union _zvalue_value {long lval; /* long value */double dval; /* double value */struct {char *val;int len;} str;HashTable *ht; /* hash table value */zend_object_value obj;
} zvalue_value;
具体的介绍都在 .1.md 里面。
但是 PHP7 之后对 _zval 进行了改进,具体代码定义在 php7.0.3/Zend/zend_types.h 中:
typedef union _zend_value {zend_long lval; /* long value */double dval; /* double value */zend_refcounted *counted;zend_string *str;zend_array *arr;zend_object *obj;zend_resource *res;zend_reference *ref;zend_ast_ref *ast;zval *zv;void *ptr;zend_class_entry *ce;zend_function *func;struct {uint32_t w1;uint32_t w2;} ww;
} zend_value;struct _zval_struct {zend_value value; /* value */union {struct {ZEND_ENDIAN_LOHI_4(zend_uchar type, /* active type */zend_uchar type_flags,zend_uchar const_flags,zend_uchar reserved) /* call info for EX(This) */} v;uint32_t type_info;} u1;union {uint32_t var_flags;uint32_t next; /* hash collision chain */uint32_t cache_slot; /* literal cache slot */uint32_t lineno; /* line number (for ast nodes) */uint32_t num_args; /* arguments number for EX(This) */uint32_t fe_pos; /* foreach position */uint32_t fe_iter_idx; /* foreach iterator index */} u2;
};
$arr[0] = 'a';
$arr[2] = 'b';
$arr[1] = 'c';foreach($arr as $a)echo $a;
解:
输出 abc。
该公司有男性员工m人,女性员工n人,要求设计一种算法用来安排周一和周四两天的午餐分组安排,设每组有x人(x是正整数且是偶数),男女比例1:1(某组人数不足x的除外),周一和周四的分组安排不能相同。
解:
像拎葡萄一样,先从跟节点拎一下,找出最长的节点,记为 node1;然后再从 node1 节点拎一下,找出当前最长的节点,记为 node2。node1 和 node2 既为两个距离最远的节点。
shop
sid | sname |
---|---|
1 | s1 |
2 | s2 |
category
cid | cname |
---|---|
1 | c1 |
2 | c2 |
goods
gid | sid | cid | gname |
---|---|---|---|
1 | 1 | 1 | g1s1c1 |
2 | 1 | 1 | g2s1s1 |
3 | 1 | 2 | g3s1c2 |
4 | 2 | 1 | g4s2c1 |
5 | 2 | 2 | g5s2c2 |
6 | 2 | 2 | g6s2c2 |
转载于:.html
本文发布于:2024-02-04 21:48:49,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170717172759908.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |