精华内容
下载资源
问答
  • 贪心算法几个经典例子

    万次阅读 2019-05-03 08:16:01
    、基本概念: ​ 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。 ​ 贪心算法没有固定的算法框架,算法设计的...

    贪心算法

    一、基本概念:

    所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。

    贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。

    所以对所采用的贪心策略一定要仔细分析其是否满足无后效性。二、贪心算法的基本思路:

    1.建立数学模型来描述问题。
    2.把求解的问题分成若干个子问题。
    3.对每一子问题求解,得到子问题的局部最优解。
    4.把子问题的解局部最优解合成原来解问题的一个解。

    三、贪心算法适用的问题

    贪心策略适用的前提是:局部最优策略能导致产生全局最优解。

    实际上,贪心算法适用的情况很少。一般,对一个问题分析是否适用于贪心算法,可以先选择该问题下的几个实际数据进行分析,就可做出判断。

    四、贪心算法的实现框架

    1 从问题的某一初始解出发;
    2 while (能朝给定总目标前进一步)
    3  { 
    4        利用可行的决策,求出可行解的一个解元素;
    5  }
    6  由所有解元素组合成问题的一个可行解;
    

    五、贪心策略的选择

    因为用贪心算法只能通过解局部最优解的策略来达到全局最优解,因此,一定要注意判断问题是否适合采用贪心算法策略,找到的解是否一定是问题的最优解。

    六、例题分析

    下面是一个可以试用贪心算法解的题目,贪心解的确不错,可惜不是最优解。

    例题① [背包问题] 有一个背包,背包容量是M=150。有7个物品,物品可以分割成任意大小。
    要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。
    物品 A B C D E F G
    重量 35 30 60 50 40 10 25
    价值 10 40 30 50 35 40 30

    分析:
    目标函数: ∑pi最大
    约束条件是装入的物品总重量不超过背包容量:∑wi<=M( M=150)
    (1)根据贪心的策略,每次挑选价值最大的物品装入背包,得到的结果是否最优?
    (2)每次挑选所占重量最小的物品装入是否能得到最优解?
    (3)每次选取单位重量价值最大的物品,成为解本题的策略。

    值得注意的是,贪心算法并不是完全不可以使用,贪心策略一旦经过证明成立后,它就是一种高效的算法。
    贪心算法还是很常见的算法之一,这是由于它简单易行,构造贪心策略不是很困难。

    可惜的是,它需要证明后才能真正运用到题目的算法中。

    一般来说,贪心算法的证明围绕着:整个问题的最优解一定由在贪心策略中存在的子问题的最优解得来的。
    对于例题中的3种贪心策略,都是无法成立(无法被证明)的,解释如下:

    (1)贪心策略:选取价值最大者。反例:

    W=30
    物品:A B C
    重量:28 12 12
    价值:30 20 20

    根据策略,首先选取物品A,接下来就无法再选取了,可是,选取B、C则更好。

    (2)贪心策略:选取重量最小。它的反例与第一种策略的反例差不多。
    (3)贪心策略:选取单位重量价值最大的物品。反例:

    W=30
    物品:A B C
    重量:28 20 10
    价值:28 20 10

    根据策略,三种物品单位重量价值一样,程序无法依据现有策略作出判断,如果选择A,则答案错误。

    **例题②[均分纸牌]**有N堆纸牌,编号分别为1,2,…,n。每堆上有若干张,但纸牌总数必为n的倍数.可以在任一堆上取若干张纸牌,然后移动。移牌的规则为:在编号为1上取的纸牌,只能移到编号为2的堆上;在编号为n的堆上取的纸牌,只能移到编号为n-1的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。例如:n=4,4堆纸牌分别为:① 9 ② 8 ③ 17 ④ 6 移动三次可以达到目的:从③取4张牌放到④ 再从③区3张放到②然后从②去1张放到①。

    输入输出样例:4

    9 8 17 6

    屏幕显示:3

    **算法分析:**设a[i]为第I堆纸牌的张数(0<=I<=n),v为均分后每堆纸牌的张数,s为最小移动次数。

    我们用贪心算法,按照从左到右的顺序移动纸牌。如第I堆的纸牌数不等于平均值,则移动一次(即s加1),分两种情况移动:

    1.若a[i]>v,则将a[i]-v张从第I堆移动到第I+1堆;
    2.若a[i]<v,则将v-a[i]张从第I+1堆移动到第I堆。

    为了设计的方便,我们把这两种情况统一看作是将a[i]-v从第I堆移动到第I+1堆,移动后有a[i]=v; a[I+1]=a[I+1]+a[i]-v.

    在从第I+1堆取出纸牌补充第I堆的过程中可能回出现第I+1堆的纸牌小于零的情况。

    如n=3,三堆指派数为1 2 27 ,这时v=10,为了使第一堆为10,要从第二堆移9张到第一堆,而第二堆只有2张可以移,这是不是意味着刚才使用贪心法是错误的呢?

    我们继续按规则分析移牌过程,从第二堆移出9张到第一堆后,第一堆有10张,第二堆剩下-7张,在从第三堆移动17张到第二堆,刚好三堆纸牌都是10,最后结果是对的,我们在移动过程中,只是改变了移动的顺序,而移动次数不便,因此此题使用贪心法可行的。

    Java源程序

    public class Greedy {
        public static void main(String[] args) {
      int n = 0, avg =0, s = 0;
      Scanner scanner = new Scanner(System.in);
      ArrayList<Integer> array = new ArrayList<Integer>();
      System.out.println("Please input the number of heaps:");
      n = scanner.nextInt();
      System.out.println("Please input heap number:");
      for (int i = 0; i < n; i++) {
       array.add(scanner.nextInt());
      }
      for(int i = 0; i < array.size(); i ++){
       avg += array.get(i);
      }
      avg = avg/array.size();
      System.out.println(array.size());
      System.out.println(avg);
      for(int i = 0; i < array.size()-1; i ++){
       s++;
       array.set(i+1, array.get(i+1)+array.get(i)-avg);   
      }
      System.out.println("s:" + s);
     }
    }
    

    利用贪心算法解题,需要解决两个问题:

    一是问题是否适合用贪心法求解。我们看一个找币的例子,如果一个货币系统有三种币值,面值分别为一角、五分和一分,求最小找币数时,可以用贪心法求解;如果将这三种币值改为一角一分、五分和一分,就不能使用贪心法求解。用贪心法解题很方便,但它的适用范围很小,判断一个问题是否适合用贪心法求解,目前还没有一个通用的方法,在信息学竞赛中,需要凭个人的经验来判断。

    二是确定了可以用贪心算法之后,如何选择一个贪心标准,才能保证得到问题的最优解。在选择贪心标准时,我们要对所选的贪心标准进行验证才能使用,不要被表面上看似正确的贪心标准所迷惑,如下面的例子。

    **例题③[最大整数]**设有n个正整数,将它们连接成一排,组成一个最大的多位整数。

    例如:n=3时,3个整数13,312,343,连成的最大整数为34331213。

    又如:n=4时,4个整数7,13,4,246,连成的最大整数为7424613。

    输入:n
    N个数
    输出:连成的多位数

    **算法分析:**此题很容易想到使用贪心法,在考试时有很多同学把整数按从大到小的顺序连接起来,测试题目的例子也都符合,但最后测试的结果却不全对。按这种标准,我们很容易找到反例:12,121应该组成12121而非12112,那么是不是相互包含的时候就从小到大呢?也不一定,如12,123就是12312而非12123,这种情况就有很多种了。是不是此题不能用贪心法呢?

    其实此题可以用贪心法来求解,只是刚才的标准不对,正确的标准是:先把整数转换成字符串,然后在比较a+b和b+a,如果a+b>=b+a,就把a排在b的前面,反之则把a排在b的后面。

    java源程序

    public static void main(String[] args){
      String str = "";
      ArrayList<String> array = new ArrayList<String>();
      Scanner in = new Scanner(System.in);
      System.out.println("Please input the number of data:");
      int n = in.nextInt();
      System.out.println("Please input the data:");
      while (n-- > 0) {
       array.add(in.next());   
      }
      for(int i = 0; i < array.size(); i ++)
       for(int j = i + 1; j < array.size(); j ++){
        if((array.get(i) + array.get(j)).compareTo(array.get(j) + array.get(i)) < 0){
         String temp = array.get(i);
         array.set(i, array.get(j));
         array.set(j, temp);
        }
       }  
      for(int i = 0; i < array.size(); i ++){
       str += array.get(i);
      }
      System.out.println("str=:"+str);  
     }
    }
    

    贪心算法所作的选择可以依赖于以往所作过的选择,但决不依赖于将来的选择,也不依赖于子问题的解,因此贪心算法与其他算法相比具有一定的速度优势。如果一个问题可以同时用几种方法解决,贪心算法应该是最好的选择之一。

    展开全文
  • 几个简单有趣的算法

    万次阅读 2010-02-09 20:37:00
    这三个算法分别为大数乘法,求交集算法,将一个数拆成连续整数和算法以及8位倒置算法。这些算法都非出自本人,但是本人实现了一个。 1.大数乘法:这个算法很著名,它可以突破计算机的限制从而计算一些很大的数,它...

    闲来无事总结3个我认为比较好的算法,很简单,但有趣。我们应该学会欣赏简单的东西,拒绝钻进复杂的东西里面,比如股市...
    这三个算法分别为大数乘法,求交集算法,将一个数拆成连续整数和算法以及8位倒置算法。这些算法都非出自本人,但是本人实现了一个。
    1.大数乘法:这个算法很著名,它可以突破计算机的限制从而计算一些很大的数,它的效率是重要的,但本文仅仅从逻辑角度来分析,先不分析时间空间复杂性。
    我们人在计算乘法的时候用的是竖式,然后把每一行的结果加起来(位相错),最后得到答案,但是在计算机中,我见过很多算法是保留一个变量作为进位,最后一古脑把进位直接加到和里面,看惯了那种方法,看看下面方法如何,它可是完全和我们人的方法是一致的 :(作者源代码是错误,以下是我改正后的)

    void main()

    {

        string  num1,num2;//被乘数和乘数,考虑到大整数,用string装入

        cout<<"please input number1 and number2:"<

        cin>>num1>>num2;

        const char *p1=num1.c_str(); //转为char *

        const char *p2=num2.c_str();

        int length=strlen(p1)+strlen(p2);

        char *p=new char [length]; //结果放在字符数组中

        int i,j;

        for(i=0;i

        {

            p[i]='0';  //初始化结果数组,开始全为'0',对应数字0

        }

        p[i]='/0';

        int  carry=0; //进位初时设为0

        for(i=strlen(p1)-1;i>=0;--i)

        {

            carry=0;//每一行都将进位清0,绝对不影响下一循环

            for(j=strlen(p2)-1;j>=0;--j)

            {

                carry+=(p1[i]-'0')*(p2[j]-'0')+(p[i+j+1]-'0');

                p[i+j+1]=carry%10+'0';

                carry/=10;

            }

            p[i+j+1]=carry%10+'0';

        }

        int b =0;

        for(i=0;i

        {

          if(p[i]=='0'&&b == 0)

          {

              continue;

           }

           b = 1;

           cout<

        }

        cout<

        delete [] p;

    }

    2.求交集算法:
    这个算法太老了,我发现很多时候都是用直接一个一个比较的办法求解,当然可以用哈希表,不过有点高射炮打蚊子的味道,于是我建议了一种算法(原创),实质上也是一个一个比较,但简捷了很多:

    int main()

    {

            int a[]={4,6,7,8,9,10,11,15};

            int b[]={2,3,4,6,7,9,10,11,15,20};

            int p1[16]={0};//把p1分配足够大即可,p1的长度是两个数组中最大的数加1,小小损失空间效率,如果有很大数的话

            int i = 0;

            for(i=0;i<8;i++)//此处的“i<8”是特殊情况,应该“i

            {

                    p1[a[i]] = 1;

            }

            for(i=0;i<9;i++)//此处的“i<9”是特殊情况,应该“i

            {

                    if(p1[b[i]]!=0)

                      printf("%d ",b[i]);//此处输出的就是结果!

            }

    }

    说明一点:数组可以不排序,乱续即可
    3.将一个数拆成连续整数和算法
    这个也很经典了,我的实现如下:

    int main()

    {

       int n = 123456;

       int i = 1;

       for( i = 1;i < n; i++ )

       {

          int j = 0;

          for( j = 0; j < n/i ; j++ )

          {

             if( 2*n == 2*i*j + i*i -i )//用等差数列推导

             {

                 int q = j;

                 int t = 0;

                 for( t = 1; t <= i; t++ )

                    t==i:printf( "%d ", q-- )?printf( "%d +", q-- );

                 printf( "= %d/n", n );

             }

           }

       }

    }

    我的实现用的是等差数列:如果i是首数,那么i+i+1+i+1+1...这可以用等差数列表示。还有一种很好的办法(比我的好):

    public class Test {

        public static void main(String[] args) {

            int left, right;

            int sum;

            //int given = Integer.parseInt(args[0]);

            int given = 27;//指定的数

            int count = 0;

            for (sum = 0  ,right=1; sum < given; sum += right, right++) {

            }

            for(left = 1,right--;left<=given/2;){

                if(sum>given)

                    sum-=(left++);

                else{

                   if(sum==given){

                      System.out.println(given+"= sum from "+left+"to"+ right);

                        count++;

                    }

                    sum+=(++right);

                }

            }

            if(count>0){

                System.out.println("一共有"+count+"解");

            }

            else{

                System.out.println("无解");

            }

        }

    }

    这 个算法实现了一种微调的思想,就是加加减减,细细品味吧。先将微调尺调到给定数据的大致位置,然后开始微调,也就是前面的继续加,加过了就从后面减,本身就有连续的思想在里面,就好像买瓜子,老大爷先大致给你个差不离,然后放到秤上,多了就减一点,少了就再加点,仔细想想,不是吗?
    4.8位倒置:
    这个算法在底层用的比较多,涉及到移位啊,等等的方法也不少,但是有一种二分法,其想法非常好,有点递归的意思,不信,看看:

    x = (x & 0x55) << 1 | (x & 0xAA) >> 1;

    x = (x & 0x33) << 2 | (x & 0xCC) >> 2;

    x = x <<4 | x>>4;

    很短,但很清晰,它将左右的概念从细到粗一步一步地逼近问题的答案,就好像一个分形一样,没有终点,但聚集起来就是一个美丽的事物,活了,真的!

    展开全文
  • 今天在《推荐系统开发实战》的读者群里聊天,在探讨技术问题的时候发现也朋友对一些非技术的问题比较感兴趣,这里进行总结和分享,希望能够帮助到看这篇文章的人。 欢迎加我的微信进行技术交流,非技术的人生思考...

    今天在《推荐系统开发实战》的读者群里聊天,在探讨技术问题的时候发现也有朋友对一些非技术的问题比较感兴趣,这里进行总结和分享,希望能够帮助到看这篇文章的人。

    欢迎加我的微信进行技术交流,非技术的人生思考问题也可以进行探讨。我的微信号如下图

    以下问题,随机排序,不分先后!

    Q、推荐算法工程师的工资待遇怎么样

    A:这个问题真的是很直接呀,当然可以理解,毕竟我们工作就是为了赚钱,为了生活。推荐算法工程师和算法工程师的待遇基本差不多,不过不同地方、不同级别的推荐算法工程师待遇肯定是不一样,比如一线的北上广深,刚进入工作环境的应届毕业生起码也得在10K以上了,当然对于一些很优秀的应届毕业生(比如清北、985、211、双一流的硕士起步的)再加上头部互联网公司的SP,月薪待遇起码得20K以上了。

    当然你付出多少,就会有多少收获,一个普本的本科毕业生想要从事推荐算法工程师,我觉得在北上广深这样竞争激烈和人才辈出的市场中,能有一个机会去实践自己的知识和想法就已经很不错了,所以对于薪资这块,还是要结合自身的知识水平取争取薪资,俗话说得好,打铁还需自身硬,所以奋斗吧少年!

    另外大家不要被网上的薪资待遇所迷惑,毕竟网上吹牛是不需要打草稿的,理性对待薪资,认真工作,磨砺技术!

    Q、业务达到什么样的程度,可以使用推荐系统进行个性化推荐

    A:首先我们要搞清楚推荐系统的意义是什么?本质是从海量的信息中筛选用户感兴趣的内容推荐给用户,从而节约用户获取有效信息的时间,继而增加用户对平台的好感,发展成为一个深度用户。

    因此,不要为了使用推荐系统而用推荐系统(不过从私心角度讲,比如一个Java开发者想要学习推荐系统的知识,但是公司的业务还没有达到使用推荐的程度,这个时候可以适当的进行鼓吹和挑起重任,哈哈有点卑劣了),那业务达到什么程度可以使用推荐系统?我个人的见解是业务有流动和转化的用户,同时内容是持续稳定的增长,且用户和内容都有一定的存量,但具体的增长速度和存量的规模需要结合自己的业务进行判断,这个东西目前还没有办法进行量化,前期可以使用一些简单的推荐策略进行推荐,然后随着业务发展可以慢慢进行策略到算法的迭代,继而搭建推荐架构,为推荐算法进行服务。

    Q、刚上推荐算法的时候,没有人工运营的效果好,正常吗

    A:正常!俗话说得好,三个臭皮匠顶个诸葛亮,这里诸葛亮就类比推荐算法,人工运营就好比“臭皮匠”。人工运营集众人的智慧和思路进行接近于完全个性化的推荐,刚引入的推荐算法在其算法先进性、数据完备性/准确性/完整性、整理流程的准确性上都可能存在或多或少的问题。

    但是,理论上算法的效果是不应该低于人工运营的,如果低了,说明这整个推荐过程中肯定存在问题,这时候就要去分析自己的业务逻辑和推荐的算法流程,分析为什么曝光量整体增加很多,但是点击率没有上去的原因。需要考虑曝光的物品是不是用户真正感兴趣的,对自己的数据产出逻辑和算法推荐逻辑进行check。

    作为推荐算法工程师要对自己的算法和算法带来的效果自信! 要为自己的算法和效果负责,不要过多的被需求牵扯!

    Q、推荐算法和数据挖掘的关系是什么

    A:数据挖掘和推荐算法都是AI领域的子集,两者是有交叉的,但并不是完全重合的,比如数据挖掘和推荐算法都会涉及一些算法(比如分类、回归等算法),但两者不同的是对业务的理解和关注的指标,数据挖掘更多是结合算法对数据进行深层次的分析继而得到一些有效的结论,但推荐算法关注的是线上的业务指标(比如点击率、GMV、用户停留时长等)。

    其实在AI领域,很多算法都是重叠的,同一个算法在不同的领域可以做不同的事情,但不会背离其算法的本质,比如一个聚类算法Kmeans,你让他去做回归拟合函数,kidding me?

    Q、推荐算法工程师需要会大数据的知识吗

    A:是需要的,因为大数据时代,数据量的规模都是比较大,单纯的靠一些单机的代码去处理数据是不现实的。

    目前推荐算法的主流有两种方式,一种是使用Spark进行模型的训练和保存,前提也是使用Spark进行训练样本数据的准备;另一种方式是使用深度学习进行模型的训练和保存,但前提也是使用Spark进行训练样本数据的准备。而且作为算法工程师,对于数据的分析、查看也是需要大数据的知识的,比如操作Hive、Hbase、Spark等。

    当然也有例外,比如一下数据量不那么大的业务,往往单机版的程序也可以满足需求,这时候其实不需要大数据的知识,但这种情况是比较少的,更何况多一种技能傍身岂不更好。所以还是建议积累一定的大数据相关的知识,主要集中在Hive、Spark,有精力的话多学一些也无妨!

    Q、如何系统的学习推荐算法

    A:想要系统的学习推荐算法,必须要大概了解一下推荐算法的发展历程,比如从开始的协同过滤,到现在的深度学习、强化学习等,这中间经历多年的发展,目前已经有比较完备的体系了,但是那些学术界和工业界的实践者门也在努力的探索和研究新的算法,创造更大的价值,推动推荐算法的发展。

    可以参考文章:传统机器学习和前沿深度学习推荐模型演化关系

    基础版本的推荐算法和实战可以参考我的书籍《推荐系统开发实战》,相信你学习完这本书之后能有一个0到1的飞跃。然后可以参考王喆老师的《推荐系统深度学习》了解基于深度学习的推荐算法,当然王喆老师的书是比较偏理论的,实践的话可以从Github上搜索一些实战项目进行学习。当然也可以关注公众号:搜索与推荐Wiki。

    所以整体的思路就是从简单学习,再到复杂!从0到1再进阶,同时结合实战项目进行学习。

    Q、在做效果提升时,效果达到一定程度后,停滞不前怎么办

    A:具体要分业务场景,比如多分类,CTR中情况是不一样的。CTR中效果停滞的时候,需要思考业务和整体数据流程,挖掘有效特征,尝试不同的CTR算法进行效果的提升测试。当然这个时候需要结合深层次的数据理解和探查,继而尝试效果的提升。

    同样对于多分类场景,上述的方法也同样适用,除此之外不是盲目的增加特征就能解决问题,有时候也要适当的做减法,分析特征的重要性,剔除不必要的特征,剔除存在多重共线性的特征,同时分析正负样本,分析数据的准确性,且在必要的时候积累更多量的数据进行尝试。

    Q、推荐算法实习生会做什么工作,怎么向上级进行工作汇报

    A:不同企业,不同业务实习生做的工作是不一样的,但肯定做的都是推荐相关的事情,当然如果运气不好,遇见没有责任心的负责人,做的事可能会偏离推荐的方向,不过这种概率很小。

    不过其实我个人更关心的一个问题是:如何做好新人的培养和引领,避免从学校步入社会后的脱轨。首先我觉得新人进入职场后,是需要一个“师父”进行带领的,第一可以帮助其快速融入公司和团队,第二可以给一些工作和技术的帮助,让其快速成长。其次要尊重毕业生或者实习生的兴趣方向,毕竟做自己喜欢的事情和擅长的事情,才能有动力和有效果的输出内容。

    关于如何向上级汇报工作,我觉得首先个人要养成一个好的工作习惯,首先记录每天的工作内容,形成自己的日报(不需要发给其他人),方便自己进行回顾和总结,其次结束每天的工作之后总结一下自己今天遗留的问题和技术上的收获,在脑海里回忆一遍,加深印象。正常周五都是会写周报的,这时候就会突显个人的工作内容了,写周报的时候要注意工作的分类、事情的关键点和取得的成效。下面是我整理的一个样例,写的也有不好的地方仅供参考。

    周报:

    1、用户兴趣模型
        - 调研用户品类偏好模型构建的方案和相关技术资料,整理成文档,链接如:xxxxx
        - 尝试适用xxx算法进行用户品类偏好模型的构建,完成了样本数据准备和代码开发,模型待训练
    2、需求开发
        - 针对xxx提出的需求,进行讨论和方案制定、讨论,并敲定最终方案,如文档:xxxxx
        - 上述方案的逻辑实现,目前已经产出数据,并进行了初步分析,符合预期,已经反馈给xxx,后续问题跟进中
    

    以上只是我的拙见,我也不并不擅长写这个,只是想把自己做的事和成果描述清楚,大家有更好的想法可以在评论区留言进行讨论。

    Q、达到什么样的水平可以收获推荐算法工程师的Offer

    A:同样还是分地区和公司,以北京举例,头部互联网公司对于应届生的要求肯定是要比创业型互联网公司高的,当然这是一个普遍的现象,但并不能代表整体。

    对于创业型的互联网公司更加看重的面试者的实战能力,因为毕竟业务紧张,人员有限,希望入职之后就能尽快的 融入到业务开发中,这时候对于我们来讲,项目经验+和团队契合的擅长的技能将会加速你获取offer。基本关键要求点如下(仅做参考)

    • 熟练掌握常用的推荐算法和原理(CF、MF、线性模型、GBDT/XGBoost/LightGBM、FM/FFM等)
    • 了解深度学习排序算法和基本知识(这里不要求说具体的算法,因为太多了,但常见的W&D、DeepFM、NFM等,且要对其他的一些排序算法有一定的了解)
    • 有一定的编码能力,且掌握大数据相关的知识(包括但不局限于Spark、Hive)
    • 对经典的二段式推荐系统架构有一定的了解(recall、rank)

    对于头部互联网公司要求肯定是比较高了,不仅要求其编码水平强硬,对于其算法的理论能力要求也比较高,如果你在顶会发表一些paper的话,肯定是更好了。头部互联网公司除了上边的核心要求点外,对深度学习的要求更高,不仅要求了解,更多的是熟练掌握。

    所以说具体上述列的基本关键要求点是必须的,在此基础之上努力耕耘,实力越强,机会越多。

    当然会存在一些特殊情况,有一些技术水平很水的人也会得到不错的推荐工作,但这是少数的,且运气成分较大,团队招人也会有特定情景的考虑,有时候真的不是水平越强就一定获得offer(当然这是少数),希望大家还是搞好技术,通过面试,拿到高薪!

    Q、推荐算法工程师的需要掌握哪些技能

    A:我之前总结过一个关于推荐系统的模块分解,如下图所示:

    推荐系统的模块分解

    推荐系统中可以拆分的职责很多,对应的岗位也很多,所以想要从事推荐系统相关的工作不一定要从事推荐算法。

    下图是从网上get的两个推荐算法工程师技能树和推荐系统工程师既能出,列的还算比较全面,大家可以参考。
    推荐系统工程师技能树

    推荐算法工程师技能树

    另外如果大家对于推荐算法的招聘要求不明确的话,可以看心仪公司的推荐算法招聘的岗位要求和职责,这才是最明确的。

    另外对于推荐算法的技能,我觉得更重要的是把自己的知识体系给建立出来,这样根据自己的技能树进行查漏补缺,同时关注业界发表的论文和技术文章,提升自己的知识。大体可以分为几个方向:

    • 传统的推荐算法
    • 基于机器学习的CTR
    • 基于深度学习的CTR
    • 排序与NLP
    • 排序与知识图谱
    • 排序与强化学习
    • 推荐系统中的模块:召回、排序、展示策略、冷启动、画像、特征工程
    • 推荐系统架构
    • 推荐系统相关的前沿论文

    最后更多精彩内容可以关注我的公众号:搜索与推荐Wiki。小编一直从事推荐算法相关的工作,会在公众号分享相关的技术知识!

    最后附上推荐系统演变史


    【技术服务】详情点击查看: https://mp.weixin.qq.com/s/PtX9ukKRBmazAWARprGIAg

    在这里插入图片描述
    扫一扫关注「搜索与推荐Wiki」!号主「专注于搜索和推荐系统,以系列分享为主,持续打造精品内容!

    展开全文
  • 今天刷算法题,碰到了一个公司的笔试小算法。此博客给出了实现过程,供大家参考学习!

    写在前面: 我是「扬帆向海」,这个昵称来源于我的名字以及女朋友的名字。我热爱技术、热爱开源、热爱编程。技术是开源的、知识是共享的。

    这博客是对自己学习的一点点总结及记录,如果您对 Java算法 感兴趣,可以关注我的动态,我们一起学习。

    用知识改变命运,让我们的家人过上更好的生活

    相关文章

    点此查看 【算法系列】 博客文章


    今天刷算法题,碰到了一个公司的笔试小算法。

    题目是:定义一个整数数组,找出连续3个元素之和是最大的,并输出这三个元素。

    示例:

    输入:2 ,-6 ,3,-9 ,15,-10, 8
    输出:15,-10, 8

    在此给出我的求解过程,仅供参考!

    代码实现

    public class ArrayTakeNum {
    
        public static void main(String[] args) {
            int[] array = {2, -6, 3, -9, 15, -10, 8};
            System.out.println("定义的整数数组为: " + Arrays.toString(array));
            //定义一个数组用于存储连续三个数字的和
            int[] temp = new int[array.length - 2];
            for (int i = 0; i < temp.length; i++) {
                int s = array[i] + array[i + 1] + array[i + 2];
                temp[i] = s;
            }
            int max = temp[0];
            int index = 0;
            for (int i = 0; i < temp.length; i++) {
                if (max < temp[i]) {
                    max = temp[i];
                    index = i;
                }
            }
            System.out.println("连续3个元素之和是最大的三个数分别是:" +
                    array[index] + "," + array[index + 1] + "," + array[index + 2]);
        }
    }
    

    测试结果:

    在这里插入图片描述


    由于水平有限,本博客难免有不足,恳请各位大佬不吝赐教!

    展开全文
  • openssl几个加密算法使用介绍

    千次阅读 2015-11-25 12:01:28
    openssl几个加密算法使用介绍1.openssl简介1)openssl概述 OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。...
  • 几个最短路径的算法

    万次阅读 多人点赞 2018-06-08 22:12:34
    一、floyd1.介绍 floyd算法只有五行代码,代码简单,三个for循环就可以解决问题,所以它的时间复杂度为O(n^3),可以求...所以,我们假设Dis(AB)为节点A到节点B的最短路径的距离,对于每一个节点X,我们检查Dis(AX)...
  • 详解贪心算法几个经典问题(代码详解)

    万次阅读 多人点赞 2018-03-15 21:09:07
    详解贪心算法几个经典问题(代码详解)贪心算法:贪心法顾名思义就是不断贪心的选取当前最优策略的计算方法。下面介绍几种贪心问题问题:货币选择问题问题描述:分别1,5,10,50,100元,分别5,2,2,3,5张纸币。...
  • 斯坦福大学《Machine Learning》第五周学习过程中,对反向传播算法几个公式看得云里雾里的,这里做一个详细的推导和总结 公式一: 公式二: 公式三: 首先已知,这个是我们定义的,不用推导,但是为什么要这样...
  • 贪心算法几个经典的例子

    千次阅读 2018-05-09 10:53:03
    贪心算法一、基本概念: 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。 贪心算法没有固定的算法框架,算法...
  • 如题,比如输入1,,2,10,5,7,8,9,11,输出其中任意几个数相加等于12的结果(不重复), 不自身相加。 1+2+9=12 10+2=12 7+5=12
  • 1一个若干学生,参加计算机课程测验,编程将成绩由大到小排序输出。 要求用排序算法实现。 请在【python的爬虫与数据分析之路】gzh后台,回复‘作业’获取答案
  • 一个简单的全排列算法

    千次阅读 多人点赞 2018-08-08 22:44:42
    本文要讨论的算法要完成的任务是:给定一个数组,输出其所有的全排列结果。要求可以概括为两点: 输出该数组所有的全排列结果 任意两个全排列是不同的,即任意两个全排列中n个数字排列的顺序不能相同   其实...
  • java递归算法)——详解以及几个经典示例

    万次阅读 多人点赞 2018-12-06 00:12:12
    递归就是一个程序或函数在其中定义或说明之间或者间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个原问题相似的规模较小的问题来求解,递归策略只需要少量的程序就可以描述出解题过程所需要的多...
  • 看了这个之后,再来看下面的程序基本就能看懂了题目我也不太记得,因为是朋友给我口述的,然后给了我一个截图,看了图片大致也能知道题目要我们做什么 package yn;import java.util.ArrayList; import java.util....
  • 几个简单而又有趣的Python算法

    万次阅读 多人点赞 2018-07-26 17:29:26
    作为一个合格的程序员,如果仅仅只是对工具或者框架熟悉,而不清楚算法,这肯定不是一个合格的,能够经得起时间考验的程序员。如果把程序员比作是一个武林高手,那么他的算法能力就是他的内功,只有内功修炼深厚了,...
  • 机器学习三部分:输入、算法输出。 输入:驱动机器学习的数据 输入是训练和算法需要的数据集。从源代码到统计数据,数据集可以包含任何东西: GSA / data(美国总务管理局数据):...
  • 字节跳动这家公司,应该是所有秋招的公司中,对算法最重视的一个了,每次面试基本都会让你手撕算法,今天这篇文章就记录下当时被问到的几个算法题,并且每个算法题我都详细着给出了最优解,下面再现当时的面试场景。...
  • 几个常用算法的适应场景及其优缺点(非常好)

    万次阅读 多人点赞 2016-10-25 10:03:58
    本文主要回顾下几个常用算法的适应场景及其优缺点! 机器学习算法太多了,分类、回归、聚类、推荐、图像识别领域等等,要想找到一个合适算法真的不容易,所以在实际应用中,我们一般都是采用启发式学习方式来实验...
  • 而当水滴在空中的坠落速度达到很大时,由于自身体积而产生一个空气阻力,也即空气摩擦阻力,水滴在空中就已经雾化了。当然雾化的原因是摩擦生热和水汽蒸发!也即是说水滴在速度没有达到能伤人的情.
  • LMS算法中的期望输出

    千次阅读 多人点赞 2018-05-31 20:10:25
    最近做线性预测分析了解了下LMS算法,但是其中的期望输出不知道怎么计算,看了很多文章只提了这是期望输出,怎么得到的却没有解释清楚。LMS(Least Mean Square)算法简介如图,LMS大致原理就是利用梯度下降法来...
  • 什么是算法算法有哪些特征?

    万次阅读 2019-11-11 07:44:45
    什么是算法算法有哪些特征? 算法定义:为解决一个问题而采取的方法和步骤,称为“算法”。 算法五大特征: ①穷性 ②确定性 ③零个或多个输入 ④有一个或多个输出 ⑤有效性 ...
  • 几个动态百分比进度条的算法实现

    千次阅读 2018-01-21 22:52:04
    做编程练习时想到的种模拟动态进度条,记录下来以备不时之需。 #!/usr/bin/env python # -*- coding:utf-8 -*- import sys, time # 第种 for i in range(1, 51): sys.stdout.write('\b\b\b>>') sys.stdout....
  • 八大排序算法

    万次阅读 多人点赞 2012-07-23 16:45:18
    排序内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,次不能容纳全部的排序记录,在排序过程中需要访问外存。 我们这里说说八大排序就是内部排序。 当n较大,则...
  • 算法快学笔记():算法入门

    千次阅读 2018-12-21 17:16:49
    1. 算法的定义 ...3. 一个算法的优劣可以用空间复杂度与时间复杂度来衡量 2. 论优秀算法的重要性 在很多场景下,数据规模越大,越能体现优秀算法的价值,接下来将以猜数游戏为例进行说明优秀算法的重要性。...
  • 在机器学习中,无监督学习...而监督型学习(Supervised learning)就是训练样本,带属性标签,也可以理解成样本输入有输出。 所有的回归算法和分类算法都属于监督学习。回归(Regression)和分类(Classifi...
  • //水仙花数是指:一个三位数,其各位数字的立方和等于该数本身 //例如:153就是一个水仙花数 //153 = 1*1*1 + 5*5*5 + 3*3*3 = 1 + 125 + 27 = 153 public class ShuiXianHuaShu { public static void main...
  • 如果输入的第一个字符是0,则怎么处理? 如果输入的是非0~9之间的字符怎么处理? 这是目前我能考虑到的问题。还是使用Matlab实现吧,主要是使用字符的ASCII值来进行这个问题的处理。clc clear closestrInput='-...
  • 算法的五重要特性

    万次阅读 2016-09-07 10:27:37
    一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的; 确定性(Definiteness) 算法中的每一条指令必须确切的含义,不能产生多义性: 可行性(Effectiveness)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 510,067
精华内容 204,026
关键字:

一个算法有几个输出