当前位置: 代码迷 >> 综合 >> ARTS 2019 07 14 (39)
  详细解决方案

ARTS 2019 07 14 (39)

热度:72   发布时间:2023-12-10 02:44:37.0

Algorithm:4. 寻找两个有序数组的中位数
Review: 电影推荐系统
Tip/Tech: 基于物品的协同过滤
Share:对冲基金是如何用卫星来会战胜华尔街的

Algorithm

4. 寻找两个有序数组的中位数

在这里插入图片描述
最简单的就是用最简单的,把两个数组分别抽出然后排成一个排好序的数组,然后根据中位数的定义,直接根据中间的索引值得到中位数的值。
如果上面这么说明有些抽象的话,我们来看看代码:

Show the Code.

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
    int[] all = new int[nums1.length + nums2.length];int index1 = 0;int index2 = 0;int allIndex = 0;int len1 = nums1.length;int len2 = nums2.length;while (index1 < len1 && index2 < len2) {
    if (nums1[index1] <= nums2[index2]) {
    all[allIndex] = nums1[index1];index1++;} else {
    all[allIndex] = nums2[index2];index2++;}allIndex++;}while (index1 < len1) {
    all[allIndex] = nums1[index1];index1++;allIndex++;}while (index2 < len2) {
    all[allIndex] = nums2[index2];index2++;allIndex++;}int midIndex = (len1 + len2) / 2;if ((len1 + len2) % 2 == 0) {
    return (all[midIndex - 1] + all[midIndex]) / 2.0;} else {
    return all[midIndex];}}
}

以上的时间复杂度就是 O ( N + M ) O(N+M) O(N+M),但是这肯定不是最好的做法,最好的做法,时候来看了答案的解析才明白的,不得不说思想的巧妙,真的是要多看几遍。这里放上连接吧
这里就贴一下代码。
https://leetcode-cn.com/problems/median-of-two-sorted-arrays/solution/xun-zhao-liang-ge-you-xu-shu-zu-de-zhong-wei-shu-b/

class Solution {
    public double findMedianSortedArrays(int[] A, int[] B) {
    int m = A.length;int n = B.length;if (m > n) {
     // to ensure m<=nint[] temp = A; A = B; B = temp;int tmp = m; m = n; n = tmp;}int iMin = 0, iMax = m, halfLen = (m + n + 1) / 2;while (iMin <= iMax) {
    int i = (iMin + iMax) / 2;int j = halfLen - i;if (i < iMax && B[j-1] > A[i]){
    iMin = i + 1; // i is too small} else if (i > iMin && A[i-1] > B[j]) {
    iMax = i - 1; // i is too big} else {
     // i is perfectint maxLeft = 0;if (i == 0) {
     maxLeft = B[j-1]; }else if (j == 0) {
     maxLeft = A[i-1]; }else {
     maxLeft = Math.max(A[i-1], B[j-1]); }if ( (m + n) % 2 == 1 ) {
     return maxLeft; }int minRight = 0;if (i == m) {
     minRight = B[j]; }else if (j == n) {
     minRight = A[i]; }else {
     minRight = Math.min(B[j], A[i]); }return (maxLeft + minRight) / 2.0;}}return 0.0;}
}

其实二分查找有个很重要就是要找出三个要素:

1 达到退出的条件: 这个就比较复杂了,要根据情况而定
2 把区间缩小的条件: 这个就是有定式的,一般都是max =i-1或者min = i + 1
3 修改中位值的操作:mid = (left + (right - left)>>1)

写出最基础的二分查找最基本的操作,但是真正可以完全理解二分思想,那又是另一个级别的故事了。

Review

https://www.kaggle.com/rounakbanik/movie-recommender-systems

这是一篇重在实践的文章,基本上就是把代码给跑一遍,具体的文章的难度并不是大。所以基本通读一遍基本上没错。
主要说了基本简单的,基于内容,基于流行度,协同过滤,这几种的算法,基本上就算是入门了推荐系统了都。

Tip/Tech

基于物品的协同过滤推荐算法

Share

https://newsroom.haas.berkeley.edu/how-hedge-funds-use-satellite-images-to-beat-wall-street-and-main-street/

How hedge funds use satellite images to beat Wall Street—and Main Street

对冲基金是如何用卫星来会战胜华尔街的

对冲基金利用卫星来观测地面的一些大型的商场的停车场的轿车的数量,来进行制定相应的投资策略。
首先这里要有一个基本的理论基础,就是沃尔玛这些机构的确是通过观察停车场的车子的数量来进行制定商业决策的。
所以对冲基金就利用相同的理论基础,只不过用了别的方法来完成了战胜市场。