Abstract. The number of triangles is a computationally expensive graph statistic which is frequently used in complex network analysis (e.g., transitivity ratio), in various random graph models (e.g., exponential random graph model) and in important real world applications such as spam detection, uncovering of the hidden thematic structure of the Web and link recommendation. Counting triangles in graphs with millions and billions of edges requires algorithms which run fast, use small amount of space, provide accurate estimates of the number of triangles and preferably are parallelizable. In this paper we present an efficient triangle counting algorithm which can be adapted to the semistreaming model [15]. The key idea of our algorithm is to combine the sampling algorithm of [34,35] and the partitioning of the set of vertices into a high degree and a low degree subset respectively as in [2], treating each set appropriately. We obtain a running time O m + m 3/2 ∆ log n tǫ 2 and an ǫ approximation (multiplicative error), where n is the number of vertices, m the number of edges and ∆ the maximum number of triangles an edge is contained. Furthermore, we show how this algorithm can be adapted to the semistreaming model with space usage O m 1/2 log n + m 3/2 ∆ log n tǫ 2 and a constant number of passes (three) over the graph stream. We apply our methods in various networks with several millions of edges and we obtain excellent results. Finally, we propose a random projection based method for triangle counting and provide a sufficient condition to obtain an estimate with low variance.