除了可以在多线程程序中使用的众所周知的数据结构,如并发堆栈、并发队列、并发列表、并发散列。是否还有其他鲜为人知但有用的数据结构可用于并行/多线程编程。
即使它们是经过一些优化的上述数据结构的一些不同版本,也请分享。
请务必包括一些参考资料。
编辑:将继续列出我发现的内容
1)ConcurrentCuckooHashing(ConcurrentHashing的优化版)
2) ConcurrentSkipList
我在一篇论文中读到,一个数除以 2 的幂的乘法是一个微不足道的过程。我在互联网上搜索了很多解释,但没有得到它。任何人都可以用简单的语言解释这实际上意味着什么。
binary computer-science bit-manipulation multiplication division
总订单:
Lamport 时间戳可用于通过使用某种任意机制来打破联系(例如进程的 ID),在分布式系统中创建事件的总排序。
逻辑顺序:
当两个实体通过消息传递进行通信时,发送事件被称为“发生在接收事件之前”,并且可以在事件之间建立逻辑顺序
谁能给我一个例子,我可以看到逻辑顺序和总顺序的差异?两个订单有什么区别?
我参与了一个项目,我们使用 MongoDB 作为主要数据库系统,使用 JavaScript/NodeJS 作为服务器端。我们需要与外部合作伙伴进行整合。
我们合作伙伴的 API 需要操作编号,该编号应该是唯一的整数值。我们决定使用 4 字节时间戳和 3 字节随机增量值的组合ObjectId,但结果数字太高,我们失去了精度。
这是程序
var getUniqueIntFromObjectId = function (object_id) {
var res = null;
object_id = object_id.toString();
res = parseInt(object_id.substring(0, 8), 16).toString() + parseInt(object_id.substring(18, 24), 16).toString();
return parseInt(res, 10);
};
Run Code Online (Sandbox Code Playgroud)
我们如何改进此程序,或更改它以实现目标?
我有一个带有 JSON 列的表,points其中一行为:
{"0": 0.2, "1": 1.2, "2": 0.5, "15": 1.2, "20": 0.7}
Run Code Online (Sandbox Code Playgroud)
我想要得到的值键"1"和"20",并将它们存储像一个别名first,并second在查询中。到目前为止我所做的是:
SELECT points, k, v from rewards CROSS JOIN UNNEST(SPLIT_TO_MAP(points, ',', ':')) AS m(k,v) where name='John'
但是这个查询给了我 k, v 的所有行。我如何只选择对应于“1”和“20”的那两个值?
考虑二叉树,其中每个节点要么是叶子节点,要么恰好拥有两个子节点(左右,我们认为是不同的)。n节点上有多少种不同的树?
例如:
- 3 个节点 -> 1 棵树,
- 4-> 0 棵树,
- 5 -> 2 棵树,
- 6 -> 0 棵树,
- 7 -> 5 棵树,
- 等等......
有什么公式对于这个序列?我已经找到了所有可能的二叉树(加泰罗尼亚数)的公式,但我正在寻找完整的树。
我不明白为什么error: no matching function for call to ‘Child::m(Mother&)在尝试编译代码时会出现此错误。
据我所知:由于 c 的类型是Child, Child::m 有一个类型参数,Child而 m 是Motherin类型,c.m(m)那么需要调用来自 Mother 类的函数 m() 。
class Mother{
public:
void m(const Mother&) {
}
};
class Child: public Mother{
public:
void m(const Child&) {
}
};
int main() {
Mother m;
Child c;
c.m(m);
}
Run Code Online (Sandbox Code Playgroud) 这段代码:
int scores[] {1,2,3,4};
int *score_ptr {scores};
//let's say that initial value of score_ptr is 1000
std::cout<<*score_ptr++;
Run Code Online (Sandbox Code Playgroud)
产生输出:
1
Run Code Online (Sandbox Code Playgroud)
As*和++具有相同的优先级,然后结合性是从右到左,我们不应该++先应用运算符,即先增加指针然后*(取消引用)它吗?
因此,相应地score_ptr将增加到1004然后取消引用它将给出分数的第二个元素,即2.
这如何以及为什么给我输出1而不是2?
所以有多种方法可以在 JS 中转换和转换Array为 a Set。
示例 #2绝对是O(n),因为它遍历数组的所有元素。示例 #1 的情况是否相同?或者JS在后台为我们做一些优化?
如果是,使用Example #1有什么缺点吗?
const arr = [ 1, 3, 2, 3, 5 ];
const set = new Set(arr);
console.log(set);
/*
Output: Set { 1, 3, 2, 5 }
*/
Run Code Online (Sandbox Code Playgroud)
const arr = [ 1, 3, 2, 3, 5 ];
const set = new Set();
arr.map(item => set.add(item));
console.log(set);
/*
Output: Set { 1, 3, 2, 5 }
*/
Run Code Online (Sandbox Code Playgroud) 很容易想出一个O(n)算法来解决这个非常著名的问题:
对于列表中的每个元素,找到比它大的第一个元素。这可以使用堆栈来完成。但是,如果我想找到大于 n*current 元素的第一个元素怎么办?
进一步来说:
给定一个数组 [2, 5, 4, 7, 3, 8, 9, 6] 并且 n = 2。
我想要 [5, -1, 9, -1, 8, -1, -1, -1] 对于 2, 5 是下一个大于 n * 2 的元素,对于 4, 9 是下一个大于 n * 的元素4. 对于 5,没有大于 n * 5 的元素,因此在该位置返回 -1。
我们能做得更好O(n^2)吗?
computer-science ×10
c++ ×2
javascript ×2
algorithm ×1
arrays ×1
big-o ×1
binary ×1
binary-tree ×1
concurrency ×1
database ×1
debugging ×1
division ×1
list ×1
mongodb ×1
pointers ×1
presto ×1
set ×1
sql ×1